<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <meta name="description" content="2.elasticsearch安装
2.1.关闭并禁用防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status fir..." />
    <meta name="keywords" content="Elasticsearch,搜索引擎" />
    <link rel="stylesheet" href="https://hzqyihui.github.io/media/css/bootstrap.min.css">
    <link rel="stylesheet" href="https://hzqyihui.github.io/styles/main.css">
    <!-- 代码渲染风格css -->
    
    <link rel="stylesheet" href="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.18.1/build/styles/rainbow.min.css">
    
    <!-- 代码高亮插件 -->
    <script src="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.18.1/build/highlight.min.js"></script>
    <!-- 代码复制插件 -->
    <script src="https://cdn.jsdelivr.net/gh/850552586/ericamcdn@0.1/js/clipboard.min.js"></script>
    <!-- live2d插件 -->
    <link rel="stylesheet" href="https://hzqyihui.github.io/media/css/live2d.css">
    <script src="https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js"></script>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.13.1/css/all.min.css" rel="stylesheet">
    <!-- 数学公式 -->
    
    <title>ElasticSearch学习：</title>

    <!-- 大纲索引css调整 -->
    
    <style>
        .markdownIt-TOC {
            margin-left: 28%;
            padding-left: 2px;
            width: 80%;
        }

        .markdownIt-TOC li {
            padding-left: 8%;
        }
    </style>
    
</head>

<body>
    <div id="landlord">
        <div class="message" style="opacity:0"></div>
        <canvas id="live2d" width="240" height="250" class="live2d"></canvas>
    </div>
    <div id="domainname" style="display:none">https://hzqyihui.github.io</div>
    <div id="content">
        <div>
            <!----------- 移动端导航栏👇 ----------------->
            <div id="bar">
                <style>
  .navmobile {
    z-index: 15;
    max-height: 40vh;
    overflow-y: scroll;
    overflow-x: hidden;
  }

  @media screen and (max-width: 1200px) {
    .navbar {
      max-width: 100vw;
    }
  }

  @media screen and (max-width:1200px) and (min-width: 768px) {
    @media (min-width: 768px) {
      .navbar-nav {
        float: right;
        margin: 0;
      }
    }
  }

  @media screen and (max-width:768px) {
    .mbapspan {
      padding: 0;
    }
  }
</style>
<div class="pjaxloading"  onclick="pjaxloadingClose()">
  <div class="loadingbackground"></div>
  <div id="loading">
    <div class="loading">
    </div>
  </div>
</div>
<nav class="navbar navbar-inverse navbar-fixed-top navmobile">
  <div class="container-fluid">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#barmenu"
        aria-expanded="false" id="barbutton">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a data-pjax class="navbar-brand" style="color:white" href="https://hzqyihui.github.io">MaxHua&#39;s Note&nbsp;&nbsp;|</a>
      <span class="navbar-brand mbapspan"><i id="mbaplayer" class="fa fa-play-circle-o" aria-hidden="true"
          style="font-size: 28px;top: 12px;position: absolute;" onclick="aplayerPlay();"></i></span>
    </div>

    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse" id="barmenu">
      <ul class="nav navbar-nav">
        
        
        <li>
          <a data-pjax href="/" style="color:white">
            首页
          </a>
        </li>
        
        
        
        <li>
          <a data-pjax href="/archives" style="color:white">
            归档
          </a>
        </li>
        
        
        
        <li>
          <a data-pjax href="/tags" style="color:white">
            标签
          </a>
        </li>
        
        
        
        <li>
          <a data-pjax href="/post/about" style="color:white">
            关于
          </a>
        </li>
        
        
        
        <li><a data-pjax href="https://hzqyihui.github.io/talk" style="color:white">说说</a></li>
        
        
          
        <li><a data-pjax href="https://hzqyihui.github.io/friends" style="color:white">友链</a></li>

        
        </ul>
      </div><!-- /.navbar-collapse -->
    </div><!-- /.container-fluid -->
  </nav>


  <!-- 引入jQuery核心js文件 -->
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js"></script>
  <script>
    let btstate = false;
    var bt = $("#barbutton");
    var bm = $("#barmenu");
    bt.click(function () {
      dropdown();
    })
    function dropdown() {
      console.log(btstate);
      //下拉
      if (btstate == false) {
        bt.removeClass("collapsed");
        bt.attr("aria-expanded", "true");
        bm.attr("aria-expanded", "true")
        bm.fadeIn(700);
        btstate = true;
      }
      else {
        bt.addClass("collapsed");
        bt.attr("aria-expanded", "false");
        bm.removeClass("in");
        bm.hide();
        bm.attr("aria-expanded", "false");
        btstate = false;
      }
    }
  </script> 
            </div>
            <!----------- 移动端导航栏👆 ----------------->

            <!--------------- pc端菜单栏👇 ---------------->
            <div class="side"><head>
    <link rel="stylesheet" href="https://hzqyihui.github.io/media/css/bootstrap.min.css">
    <link rel="stylesheet" href="https://hzqyihui.github.io/styles/main.css">
    
    <link rel="stylesheet" href="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.18.1/build/styles/rainbow.min.css">
    
    <script src="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.18.1/build/highlight.min.js"></script>
    <script src="https://cdn.jsdelivr.net/gh/850552586/ericamcdn@0.1/js/clipboard.min.js"></script>
    <link rel="stylesheet" href="https://hzqyihui.github.io/media/css/live2d.css">
    <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.13.1/css/all.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <!-- fancybox -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css" />
    <script src="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js"></script>


    <!--------- 数学公式👇---- -->
    
    <!--------- 数学公式👆----------------- -->
    <!--------- daovocie功能👇 ------------------->
    
    <script type="text/javascript">
        window.$crisp = [];
        window.CRISP_WEBSITE_ID = "6fbd6157-accf-49b0-9398-56a347b943f8";
        (function () {
            d = document;
            s = d.createElement("script");
            s.src = "https://client.crisp.chat/l.js";
            s.async = 1;
            d.getElementsByTagName("head")[0].appendChild(s);
        })();
    </script>
    
    <!--------- daovocie功能👆 ------------------->
    <!-- -----------------twikoo评论系统引入👇 --------->
    <script src="https://cdn.jsdelivr.net/npm/twikoo@1.3.1/dist/twikoo.all.min.js"></script>
    <!-- -----------------twikoo评论系统引入👆 --------->
    <!---------------- leancloud api 功能依赖引入👇 -------->
    <script src="https://cdn.jsdelivr.net/npm/leancloud-storage@3.13.0/dist/av-min.js"></script>
    <!---------------- leancloud api 功能依赖引入👆 -------->
    <!------------------ valine评论系统引入👇 ------------------>
    <script src="https://hzqyihui.github.io/media/js/valine.min.js"></script>
    <!------------------ valine评论系统引入👆 ------------------>
    <!---------------- 今日诗词api功能依赖👇 ----------------------->
    <script src="https://sdk.jinrishici.com/v2/browser/jinrishici.js" charset="utf-8"></script>
    <!---------------- 今日诗词api功能依赖👆 ----------------------->
    <!---------------- 今日诗词api功能依赖👇 ----------------------->
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ispeak-bber/ispeak-bber.min.js" charset="utf-8"></script>
    <!---------------- 哔哔功能依赖👆 ----------------------->


</head>

<style>
    body {
        overflow-x: hidden;
        height: 100vh;
        overflow-y: scroll;
        cursor: url("https://hzqyihui.github.io/media/images/mouse_cursor.png"), auto
    }
</style>

<body>
    <!--=------ 页面加载动态画面👇 --------------->
    <div class="pjaxloading" onclick="pjaxloadingClose()">
        <div class="loadingbackground"></div>
        <div id="loading-aname">
            <div class="loading-aname">
            </div>
        </div>
    </div>
    <!--=------ 页面加载动态画面👆 --------------->

    <!--------------- 左侧菜单栏👇 ------------------------>
    
    <div id=side>
        <div class="r_m_div">
            <a onclick="showAaplayer()"><i style="font-size: 20px;"><img
                        src='https://hzqyihui.github.io/media/images/music.png' alt="音乐播放器" class="musicbtn"></i></a>
        </div>
        <div class="avatar-border">
            <img src="https://hzqyihui.github.io/images/avatar.png?v=1665303694187" class="avatar">
        </div>
        <div class="sitename">MaxHua&#39;s Note</div>
        <span class="description" data-text='["当能力和欲望不匹配时，人会极度痛苦。"]'>&nbsp;</span>
        <div class="siteinfocontainer">
            <span class="siteinfo">文章</span>
            <span class="siteinfo">标签</span>
        </div>
        <div class="siteinfocontainer">
            <span class="siteinfo" id="siteinfo-postsnum"></span>
            <span class="siteinfo">60</span>
        </div>
        
        <div class="search">
            <!-- <input type="text" class="search-input" placeholder="标题搜索(●'◡'●)" /> -->
            <input type="text" class="search-input" placeholder="标题搜索 ⚆_⚆ つ♡">
            <div class="search-results"></div>
        </div>
        
    <div class="share-button">
        <span>Look At Me</span>
        
        <a href="https://github.com/hzqyihui" target="_blank"><i style="font-size: 20px;"><img class="icon"
                    src="https://hzqyihui.github.io/media/images/github.png" alt=""></i></a>
        
        
        <a onclick="showqq()"><i style="font-size: 20px;"><img class="icon"
                    src="https://hzqyihui.github.io/media/images/QQ.png" alt=""></i></a>
        
        
        <a href="https://zhihu.com/people/hzq_yihui" target="_blank"><i style="font-size: 20px;"><img class="icon"
                    src="https://hzqyihui.github.io/media/images/zh.png" alt=""></i></a>
        
        
        
        
        
        <a href="https://music.163.com/#/user/home?id=1318641230" target="_blank"><i style="font-size: 20px;"><img class="icon"
                    src="https://hzqyihui.github.io/media/images/wyy.png" alt=""></i></a>
        
        
    </div>
    <div id="qq" style="display:none">77430203</div>
    <!------------ 加载菜单按钮👇 ------------------------->
    <div class="menucontainer">
        
        
        <div class="mchocie description">
            <a data-pjax href="/" class="menubutton" style="margin-right: 15px;">
                <i><img class="icon menuicon" src="" alt="首页"></i>&nbsp;<span
                    data-text="首页">首页</span>
            </a>
        </div>
        
        
        
        <div class="mchocie description">
            <a data-pjax href="/archives" class="menubutton" style="margin-right: 15px;">
                <i><img class="icon menuicon" src="" alt="归档"></i>&nbsp;<span
                    data-text="归档">归档</span>
            </a>
        </div>
        
        
        
        <div class="mchocie description">
            <a data-pjax href="/tags" class="menubutton" style="margin-right: 15px;">
                <i><img class="icon menuicon" src="" alt="标签"></i>&nbsp;<span
                    data-text="标签">标签</span>
            </a>
        </div>
        
        
        
        <div class="mchocie description">
            <a data-pjax href="/post/about" class="menubutton" style="margin-right: 15px;">
                <i><img class="icon menuicon" src="" alt="关于"></i>&nbsp;<span
                    data-text="关于">关于</span>
            </a>
        </div>
        
        

        
        <div class="mchocie description">
            <a data-pjax href="https://hzqyihui.github.io/talk" class="menubutton" style="margin-right: 15px;">
                <i><img class="icon menuicon" src="" alt="说说"></i>&nbsp;<span data-text="说说">说说</span>
            </a>
        </div>
        
        
        
        <div class="mchocie description">
            <a data-pjax href="https://hzqyihui.github.io/friends" class="menubutton" style="margin-right: 15px;">
                <i><img class="icon menuicon" src="" alt="友人帐"></i>&nbsp;<span data-text="友人帐">友人帐</span>
            </a>
        </div>
        
        <!--  -->
    </div>
    <!------------ 加载菜单按钮👆 ------------------------->
    <hr>
    <style>
    .copyright {
        font-size: 15px;
        color: #d9d9d9;
    }


    @media screen and (min-width: 1200px) {
        .foot {
            width: 100%;
            height: 130px;
        }
    }

    @media screen and (max-width: 1200px) {
        .foot {
            display: none;
        }
    }
</style>

<body>
    <div class="foot">
        <div id="footinfo">Powered by <a href="https://github.com/hzqyihui/" target="_blank">Maxhua</a> | Theme: <a
                href="https://github.com/850552586/gridea-theme-fog">Fog</a>
            <div>
                
                <div id="sitegotimeDate">载入天数...</div>
                <div id="sitegotimes">载入时分秒...</div>
                <div id="cussitetime" style="display:none">02/22/2018</div>
                
            </div>
            <div>
                
            </div>
            <div class="copyright" style="color:white;text-align: center;">
            </div>
        </div>



    </div>
</body>

<script>
    //----------------------站点运行时间
    var now = new Date();

    function createtime() {
        var sitegotime = document.getElementById("cussitetime").innerHTML + " 00:00:00";
        var grt = new Date(sitegotime); //此处修改你的建站时间或者网站上线时间 
        now.setTime(now.getTime() + 250);
        days = (now - grt) / 1000 / 60 / 60 / 24;
        dnum = Math.floor(days);
        hours = (now - grt) / 1000 / 60 / 60 - (24 * dnum);
        hnum = Math.floor(hours);
        if (String(hnum).length == 1) {
            hnum = "0" + hnum;
        }
        minutes = (now - grt) / 1000 / 60 - (24 * 60 * dnum) - (60 * hnum);
        mnum = Math.floor(minutes);
        if (String(mnum).length == 1) {
            mnum = "0" + mnum;
        }
        seconds = (now - grt) / 1000 - (24 * 60 * 60 * dnum) - (60 * 60 * hnum) - (60 * mnum);
        snum = Math.round(seconds);
        if (String(snum).length == 1) {
            snum = "0" + snum;
        }
        document.getElementById("sitegotimeDate").innerHTML = "本站已安全运行 " + dnum + " 天 ";
        document.getElementById("sitegotimes").innerHTML = hnum + " 小时 " + mnum + " 分 " + snum + " 秒";
    }

    let intervalId = setInterval("createtime()", 250);
</script>

    </div>

    <img class="moon" src="https://hzqyihui.github.io/media/images/moon.png" onclick="moonlight()">
    <script src="https://hzqyihui.github.io/media/js/wordshow.js"></script>
    
    <!--------------- 左侧菜单栏👆 ------------------------>

    <!----------------- 顶部菜单栏👇 ------------------------>
    
    <!----------------- 顶部菜单栏👆 ------------------------>

<!--核心功能加载-->
<script src="https://hzqyihui.github.io/media/js/mainfunc.js"></script>

<!------------- Fog1.0版本彩蛋👇 -------------->
    <!-- <section id="terrestrial" class="popup">
        <a href="#" class="back">&lt; back</a>
    </section>

    <div class="flycontainer">
        <div class="flyword">御风飞行中...</div>
    </div>

    <script>
        $("#fog_go").click(function(){fog_go()});
        async function fog_go(){
            $(".bars").hide()
            $("#live2d").hide()
            await sleep(3000);
            $(".flycontainer").css("display","flex");
            $(".popup").fadeOut(500)
            await sleep(2000);
            var sitename = "MaxHua&#39;s Note";
            getFogUser(sitename);
        }

        function fog_goregis(){
            var sitename = "MaxHua&#39;s Note";
            var siteurl = "https://hzqyihui.github.io";
            regisFogUser(sitename,siteurl);
        }
        fog_goregis();
    </script> -->
<!------------- Fog1.0版本彩蛋👆 -------------->
<script>
    function change_topmenu(){
        tmcolor = "black"
        tsnamecolor = "antiquewhite"
        $(".navbar-inverse .navbar-nav>li>a").css("color",tmcolor)
        $(".navbar-inverse .navbar-brand").css("color",tsnamecolor)
        $(".navbar-fixed-top").css("border-radius","0 0 10px 10px")
    }
</script>

<!------ 根据自定义配置声明变量👇 --------------------->
    
    <script>
        var postnumChoice = true
    </script>
    
    
    <script>
        var shareChoice = true
    </script>
    
    
    <script>
        var donateChoice = true
    </script>
    
    
    <script>
        var searchChoice = true
    </script>
    
    <script>let postsnum = 0;</script>
    <div id="side-posttitle" style="display: none;">
    
    
    Go语言Sync包的锁
    <script>
        postsnum += 1
    </script>
    
    
    
    
    
    Nacos安装和配置：
    <script>
        postsnum += 1
    </script>
    
    
    
    Nacos基本使用：
    <script>
        postsnum += 1
    </script>
    
    
    
    布隆过滤器
    <script>
        postsnum += 1
    </script>
    
    
    
    brew换源：
    <script>
        postsnum += 1
    </script>
    
    
    
    jenkins的安装和配置：
    <script>
        postsnum += 1
    </script>
    
    
    
    Kong怎么和Consul配套使用？
    <script>
        postsnum += 1
    </script>
    
    
    
    Kong的安装和配置：
    <script>
        postsnum += 1
    </script>
    
    
    
    什么是API网关？
    <script>
        postsnum += 1
    </script>
    
    
    
    RocketMQ Go 消息使用：
    <script>
        postsnum += 1
    </script>
    
    
    
    服务雪崩
    <script>
        postsnum += 1
    </script>
    
    
    
    gRPC的超时和重试
    <script>
        postsnum += 1
    </script>
    
    
    
    常见的幂等性解决方案
    <script>
        postsnum += 1
    </script>
    
    
    
    Rocket基本概念：
    <script>
        postsnum += 1
    </script>
    
    
    
    Rocket安装和配置
    <script>
        postsnum += 1
    </script>
    
    
    
    常见分布式事务解决方案：
    <script>
        postsnum += 1
    </script>
    
    
    
    CAP和BASE理论：
    <script>
        postsnum += 1
    </script>
    
    
    
    事务和分布式事务：
    <script>
        postsnum += 1
    </script>
    
    
    
    ElasticSearch学习：
    <script>
        postsnum += 1
    </script>
    
    
    
    什么是elasticsearch
    <script>
        postsnum += 1
    </script>
    
    
    
    Redis 的 RedLock：
    <script>
        postsnum += 1
    </script>
    
    
    
    常见的分布式锁的实现方案：
    <script>
        postsnum += 1
    </script>
    
    
    
    单机锁
    <script>
        postsnum += 1
    </script>
    
    
    
    Go工具-随机获取可用端口并监听：
    <script>
        postsnum += 1
    </script>
    
    
    
    负载均衡算法：
    <script>
        postsnum += 1
    </script>
    
    
    
    负载均衡策略：
    <script>
        postsnum += 1
    </script>
    
    
    
    JWT集成在Gin框架中
    <script>
        postsnum += 1
    </script>
    
    
    
    Go工具-Viper配置文件管理器
    <script>
        postsnum += 1
    </script>
    
    
    
    二叉树层序遍历
    <script>
        postsnum += 1
    </script>
    
    
    
    二叉树后序遍历
    <script>
        postsnum += 1
    </script>
    
    
    
    二叉树中序遍历
    <script>
        postsnum += 1
    </script>
    
    
    
    二叉树先序遍历
    <script>
        postsnum += 1
    </script>
    
    
    
    Dockerfile 的语法使用：
    <script>
        postsnum += 1
    </script>
    
    
    
    Nginx重写和转发规则：
    <script>
        postsnum += 1
    </script>
    
    
    
    HTTP版本：
    <script>
        postsnum += 1
    </script>
    
    
    
    HTTP请求响应过程：
    <script>
        postsnum += 1
    </script>
    
    
    
    TCP和UDP的区别：
    <script>
        postsnum += 1
    </script>
    
    
    
    插入排序
    <script>
        postsnum += 1
    </script>
    
    
    
    Go工具-proto文件编译
    <script>
        postsnum += 1
    </script>
    
    
    
    二分查找算法
    <script>
        postsnum += 1
    </script>
    
    
    
    sed命令：
    <script>
        postsnum += 1
    </script>
    
    
    
    xargs命令：
    <script>
        postsnum += 1
    </script>
    
    
    
    firewall命令（防火墙）：
    <script>
        postsnum += 1
    </script>
    
    
    
    nohup 命令：
    <script>
        postsnum += 1
    </script>
    
    
    
    安装 FFmpeg：
    <script>
        postsnum += 1
    </script>
    
    
    
    umask命令：
    <script>
        postsnum += 1
    </script>
    
    
    
    shell 笔记：
    <script>
        postsnum += 1
    </script>
    
    
    
    GIT分支与工作流
    <script>
        postsnum += 1
    </script>
    
    
    
    netstat命令：查看端口占用
    <script>
        postsnum += 1
    </script>
    
    
    
    nl命令：带行号查看文件
    <script>
        postsnum += 1
    </script>
    
    
    
    Git奇难杂症：
    <script>
        postsnum += 1
    </script>
    
    
    
    Redis安装笔记
    <script>
        postsnum += 1
    </script>
    
    
    
    排序的稳定性含义：
    <script>
        postsnum += 1
    </script>
    
    
    
    希尔排序
    <script>
        postsnum += 1
    </script>
    
    
    
    SSH开启无密码登录
    <script>
        postsnum += 1
    </script>
    
    
    
    改进版快速排序
    <script>
        postsnum += 1
    </script>
    
    
    
    冒泡排序
    <script>
        postsnum += 1
    </script>
    
    
    
    堆排序
    <script>
        postsnum += 1
    </script>
    
    
    
    选择排序
    <script>
        postsnum += 1
    </script>
    
    
    
    归并排序
    <script>
        postsnum += 1
    </script>
    
    
    
    位运算计算中间值：
    <script>
        postsnum += 1
    </script>
    
    
    
    递归的时间复杂度：
    <script>
        postsnum += 1
    </script>
    
    
    
    对数器
    <script>
        postsnum += 1
    </script>
    
    
    
    stat命令： 查看文件的修改
    <script>
        postsnum += 1
    </script>
    
    
    
    Windows快捷键
    <script>
        postsnum += 1
    </script>
    
    
    
    各类查找命令：
    <script>
        postsnum += 1
    </script>
    
    
    
    Go进阶知识点
    <script>
        postsnum += 1
    </script>
    
    
    
    date命令：
    <script>
        postsnum += 1
    </script>
    
    
    
    find 命令：
    <script>
        postsnum += 1
    </script>
    
    
    
    Linux进程，内存查看
    <script>
        postsnum += 1
    </script>
    
    
    
    Go基础知识点
    <script>
        postsnum += 1
    </script>
    
    
    
    tree命令
    <script>
        postsnum += 1
    </script>
    
    
    
    GOROOT, GOPATH
    <script>
        postsnum += 1
    </script>
    
    
    
    locate 命令：
    <script>
        postsnum += 1
    </script>
    
    
    
    Nginx 安装
    <script>
        postsnum += 1
    </script>
    
    
    
    PHP 知识点分享
    <script>
        postsnum += 1
    </script>
    
    
    
    Zsh 插件安装：
    <script>
        postsnum += 1
    </script>
    
    
    
    Linux系统基本知识点
    <script>
        postsnum += 1
    </script>
    
    
    
    Linux操作提升效率
    <script>
        postsnum += 1
    </script>
    
    
    
    Linux命令操作快捷键
    <script>
        postsnum += 1
    </script>
    
    
    
    YAML语法
    <script>
        postsnum += 1
    </script>
    
    
    
    VIM学习笔记：
    <script>
        postsnum += 1
    </script>
    
    
    
    经典快速排序
    <script>
        postsnum += 1
    </script>
    
    
    
    crontab
    <script>
        postsnum += 1
    </script>
    
    
    
    环境变量etc profile文件解析：
    <script>
        postsnum += 1
    </script>
    
    
    
    Linux etc sudoers文件说明：
    <script>
        postsnum += 1
    </script>
    
    
    
    Linux 用户，用户组相关命令
    <script>
        postsnum += 1
    </script>
    
    
    
    ln命令：对文件做链接，类似Windows的快捷方式
    <script>
        postsnum += 1
    </script>
    
    
    
    df
    <script>
        postsnum += 1
    </script>
    
    
    
    chmod：
    <script>
        postsnum += 1
    </script>
    
    
    
    用户埋点处理，用户行为分析技术：
    <script>
        postsnum += 1
    </script>
    
    
    
    PHP SPL扩展库
    <script>
        postsnum += 1
    </script>
    
    
    
    Beanstalked学习笔记：
    <script>
        postsnum += 1
    </script>
    
    
    
    tar命令：
    <script>
        postsnum += 1
    </script>
    
    
    
    GIT 原理   ：
    <script>
        postsnum += 1
    </script>
    
    
    
    tmux使用
    <script>
        postsnum += 1
    </script>
    
    
    
    Debian9学习笔记：
    <script>
        postsnum += 1
    </script>
    
    
    
    Docker学习笔记
    <script>
        postsnum += 1
    </script>
    
    
    
    在Debian9安装Docker
    <script>
        postsnum += 1
    </script>
    
    
    
    Git学习笔记
    <script>
        postsnum += 1
    </script>
    
    
    
    
    </div>
    
        <script>
            var menupos = 'left';
            $("#siteinfo-postsnum").html(postsnum);
        </script>
    
    <script>
        let commentsHide = false
    </script>
    <!------ 根据自定义配置声明变量👆 --------------------->


    <!----------根据自定义配置设置图标信息👇---------->
    <script>
        var icondict = new Array();
    </script>
    
        
            <script>
                var iconname = "首页";
                var iconurl = "Home";
                icondict[iconname] = iconurl;
            </script>
        
            <script>
                var iconname = "关于";
                var iconurl = "About";
                icondict[iconname] = iconurl;
            </script>
        
            <script>
                var iconname = "友人帐";
                var iconurl = "Friends";
                icondict[iconname] = iconurl;
            </script>
        
            <script>
                var iconname = "归档";
                var iconurl = "Archive";
                icondict[iconname] = iconurl;
            </script>
        
            <script>
                var iconname = "标签";
                var iconurl = "Tag";
                icondict[iconname] = iconurl;
            </script>
        
            <script>
                var iconname = "说说";
                var iconurl = "Talk";
                icondict[iconname] = iconurl;
            </script>
        
    
    <!----------根据自定义配置设置图标信息👆---------->
</body>

<script src="https://hzqyihui.github.io/media/share/dist/Share.js"></script>
<!-- 页面pjax测试 -->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery.pjax/2.0.1/jquery.pjax.js"></script>
<!--确保jQuery已经在此之前加载-->
<!-- <script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script> -->
<script src="https://hzqyihui.github.io/media/js/all-pjax.js"></script>
<script>
    //-------------------------------说说功能👇--------------------------------------
    let talksall = [];
    let talks = [];
    let talkindex = 0;
    get();

    function get() {
        var t = JSON.parse('[]');
        talkindex = t.length - 1;
        for (var i = 0; i <= t.length - 1; i++) {
            var d = {};
            d["time"] = t[i].time;
            d["author"] = t[i].author;
            d["text"] = t[i].text;
            d["img"] = t[i].img;
            talksall.push(d);
        }
    }

    function add() {
        for (var i = talkindex; i >= 0 && i > talkindex - 3; i--) {
            talks.push(talksall[i]);
        }
        talkindex = (talkindex - 3) >= 0 ? (talkindex - 3) : -1;
        if (talkindex < 0) $("#getmorebt").hide();
        show();
    }

    function show() {
        var talkT = document.getElementById("talkContainer");
        talkT.innerHTML = "";
        for (var i = 0; i < talks.length; i++) {
            if (talks[i].img != '') {
                talkT.innerHTML += '\
            <div class="talk" v-for="t in talks"> \
                <span data-fancybox="images" href="' + talks[i].img + '"><img src="' + talks[i].img + '" class="talkimg"></span> \
                <div class="ainfo">\
                    <div class="ainfo-intro">\
                        <div class="author">' + talks[i].author + '</div>·\
                        <div class="time">' + talks[i].time + '</div>\
                    </div>\
                </div>\
                <div class="talkcontent">' + talks[i].text + '\
                </div\>\
            ';
            } else {
                talkT.innerHTML += '\
            <div class="talk" v-for="t in talks"> \
                <div class="ainfo">\
                    <div class="ainfo-intro">\
                        <div class="author">' + talks[i].author + '</div>·\
                        <div class="time">' + talks[i].time + '</div>\
                    </div>\
                </div>\
                <div class="talkcontent">' + talks[i].text + '\
                </div\>\
            ';
            }
        }
    }
    //-------------------------------说说功能👆--------------------------------------
</script>

<!---->
<script>
    function replaceAvatar() {
        twikoo_avatar = $(".tk-avatar-img");
        for (var i = 0; i < twikoo_avatar.length; i++) {
            var asrc = twikoo_avatar.eq(i).attr('src');
            if (asrc.search('cn.gravatar.com') != -1) {
                twikoo_avatar.eq(i).attr('src', 'https://hzqyihui.github.io/media/images/comavatar.png');
            }
        }
    }

    function showWechat() {
        var wechat = '';
        alert("博主微信号：" + wechat);
        return false;
    }
</script>

<script>
    /**
     * https://github.com/tangkaichuan/gridea-search
     */
    // 检查缓存是否最新
    function checkCache() {
        var caches_postsnum = localStorage.getItem("postsnum");
        var pt = document.getElementById("side-posttitle").innerHTML;
        pt = pt.replace(/\s+/g, '').replace(/<script>.*?<\/script>/gi, "")
        var ptlen = pt.length;
        var ptlen_storage = localStorage.getItem("poststitlelen");
        if (caches_postsnum != postsnum || ptlen != ptlen_storage) {
            console.log("更新缓存");
            return false
        }
        return true;
    }

    (function () {
        var CACHES = checkCache()
        if (!CACHES) {
            var NOW = Date.now()
            var API_CONTENT = '../api-content/index.html' + '?_=' + NOW
            preload(API_CONTENT);
            getContents(show_getContentresult);
        }

        function show_getContentresult(data) {
            console.log("获取成功");
            var postslen = data["posts"].length;
            localStorage.setItem('postsnum', postslen);
            var poststitlelen = 0;
            var pt = document.getElementById("side-posttitle").innerHTML;
            pt = pt.replace(/\s+/g, '').replace(/<script>.*?<\/script>/gi, "");
            localStorage.setItem('poststitlelen', pt.length);
        }



        // preload
        function preload(url) {
            var preloadLink = document.createElement('link')
            preloadLink.href = url
            preloadLink.rel = 'preload'
            preloadLink.as = 'fetch'
            preloadLink.crossOrigin = 'anonymous'
            document.head.appendChild(preloadLink)
        }

        // 异步 GET 请求
        function get(obj) {
            var xhr = new XMLHttpRequest()
            xhr.open('get', obj.url, true)
            xhr.send(null)
            xhr.onreadystatechange = function () {
                // 异步请求：响应状态为4，数据加载完毕
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        obj.success(xhr.responseText)
                    } else {
                        obj.error(xhr.status)
                    }
                }
            }
        }

        // 获取博客全文 api
        function getContents(callback) {
            if (CACHES) {
                callback(CACHES.contents)
            } else {
                get({
                    url: API_CONTENT,
                    success: function (data) {
                        callback(JSON.parse(data));
                        localStorage.setItem('ContentsCache', data);
                        getStorageContent();
                    }
                })
            }
        }
    })()
    //------------------------核心功能--pjax全局渲染👇-------------------
    let talkinit = false;
    $(document).pjax('a[data-pjax]', '#main', {
        fragment: '#main',
        timeout: 8000
    }).on('pjax:complete', function () {
        //代码块高亮渲染
        document.querySelectorAll('pre code').forEach((block) => {
            hljs.highlightBlock(block);
        });
        //文章热度
        if(postnumChoice){
            getHotnum();
        }
        //文章索引
        toginit();
        //清空搜索栏
        if (searchChoice) {
            searchInit();
            searchInput.value = "";
        }
        var pl = window.location.pathname;
        //说说更新
        if (pl.search("talk") != -1 && !talkinit) {
            add();
            talkinit = true;
        } else if (pl.search("talk") != -1) {
            show();
        }
        if (pl.search("post") != -1) {
            if (shareChoice)
                shareInit();
            if (donateChoice)
                donateInit();
            if ("valine" == "default"&&!commentsHide) {
                $("#comment").hide()
                commentsHide = true
            }
            lazyload();
            codeinit();
            if ("valine" == "twikoo") {
                //twikoo头像更换
                setTimeout(replaceAvatar, 3000);
                setTimeout(replaceAvatar, 8000); //部分博主站点速度加载过慢，再添加一个延迟
            }
        }
        if (btstate == true)
            dropdown();
    }).on('pjax:start', function () {
        $(".pjaxloading").fadeIn(50);
    }).on('pjax:end', function () {
        $(".pjaxloading").fadeOut(50);
    });
    //------------------------核心功能--pjax全局渲染👆-------------------

    //-------------------------------------------------搜索
    // 获取搜索框、搜索按钮、清空搜索、结果输出对应的元素
    if (searchChoice) {
        var searchInput = document.querySelector('.search-input');
        var searchResults = document.querySelector('.search-results');
    }
    // 申明保存文章的标题、链接、内容的数组变量
    var searchValue = '',
        arrItems = [],
        arrLinks = [],
        arrTitles = [],
        arrContents = [],
        arrResults = [],
        indexItem = [],
        itemLength = 0;
    var tmpDiv = document.createElement('div');
    tmpDiv.className = 'result-item';


    function getStorageContent() {
        var data = localStorage.getItem('ContentsCache');
        data = JSON.parse(data);
        posts = data["posts"];
        for (var i = 0; i < posts.length; i++) {
            arrLinks[i] = posts[i].link;
            arrTitles[i] = posts[i].title;
            arrContents[i] = posts[i].content;
            itemLength++;
        }
    }
    if (checkCache())
        getStorageContent();
    // 输入框内容变化后就开始匹配，可以不用点按钮
    // 经测试，onkeydown, onchange 等方法效果不太理想，
    // 存在输入延迟等问题，最后发现触发 input 事件最理想，
    // 并且可以处理中文输入法拼写的变化
    searchInput.oninput = function () {
        setTimeout(searchConfirm, 0);
    }
    searchInput.onfocus = function () {
        searchResults.style.display = 'block';
    }

    function searchConfirm() {
        if (searchInput.value == '') {
            searchResults.style.display = 'none';
        } else if (searchInput.value.search(/^\s+$/) >= 0) {
            // 检测输入值全是空白的情况
            searchInit();
            var itemDiv = tmpDiv.cloneNode(true);
            itemDiv.innerText = '请输入有效内容...';
            searchResults.appendChild(itemDiv);
        } else {
            // 合法输入值的情况
            searchInit();
            searchValue = searchInput.value;
            // 在标题、内容中查找
            searchMatching(arrTitles, arrContents, searchValue);
        }
    }

    // 每次搜索完成后的初始化
    function searchInit() {
        arrResults = [];
        indexItem = [];
        searchResults.innerHTML = '';
        searchResults.style.display = 'block';
    }

    function searchMatching(arr1, arr2, input) {
        // 忽略输入大小写
        input = new RegExp(input, 'i');
        var step = 10;
        // 在所有文章标题、内容中匹配查询值
        for (i = 0; i < itemLength; i++) {
            var indexContent = arr2[i].search(input);
            //标题匹配
            if (arr1[i].search(input) != -1) {
                indexItem.push(i); // 保存匹配值的索引
                if (indexContent != -1) {
                    startindex = (indexContent - step) >= 0 ? (indexContent - step) : 0;
                    var searchcontent = arr2[i].slice(indexContent - step, indexContent + 5)
                    arrResults.push("....." + searchcontent + ".....");
                } else
                    arrResults.push("");
            }
            //内容匹配
            else if (indexContent != -1) {
                indexItem.push(i); // 保存匹配值的索引

                startindex = (indexContent - step) >= 0 ? (indexContent - step) : 0;
                var searchcontent = arr2[i].slice(indexContent - step, indexContent + 5)
                arrResults.push("....." + searchcontent + ".....");
            }
        }

        // 输出总共匹配到的数目
        var totalDiv = tmpDiv.cloneNode(true);
        totalDiv.innerHTML = '<b>总匹配：' + indexItem.length + ' 项<hr></b>';
        searchResults.appendChild(totalDiv);

        // 未匹配到内容的情况
        if (indexItem.length == 0) {
            var itemDiv = tmpDiv.cloneNode(true);
            itemDiv.innerText = '未匹配到内容...';
            searchResults.appendChild(itemDiv);
        }

        // 将所有匹配内容进行组合
        for (i = 0; i < arrResults.length; i++) {
            var itemDiv = tmpDiv.cloneNode(true);
            itemDiv.innerHTML = '<a data-pjax class="searchresults" href="' + arrLinks[indexItem[i]] + '"><b>[' +
                arrTitles[indexItem[i]] +
                ']</b><p>' + arrResults[i] + '</p></a><hr />';
            searchResults.appendChild(itemDiv);
        }
    }
</script>



<!--------------------- 菜单栏图标加载功能👇 ----------------------->
<script>
var menulist = $(".menuicon");
var menulength = menulist.length;
for (var i = 0; i < menulength; i++) {
    var altname = menulist.eq(i).attr("alt");
    var iconurl = icondict[altname];
    if (iconurl == undefined || iconurl == '')
        continue;
    if (iconurl == 'Home') {
        menulist.eq(i).attr("src", "https://hzqyihui.github.io/media/images/Home.png");
menulist.eq(i).show();
} else if (iconurl == 'Archive') {
menulist.eq(i).attr("src", "https://hzqyihui.github.io/media/images/Archive.png");
menulist.eq(i).show();
} else if (iconurl == 'Tag') {
menulist.eq(i).attr("src", "https://hzqyihui.github.io/media/images/Tag.png");
menulist.eq(i).show();
} else if (iconurl == 'About') {
menulist.eq(i).attr("src", "https://hzqyihui.github.io/media/images/About.png");
menulist.eq(i).show();
} else if (iconurl == 'Talk') {
menulist.eq(i).attr("src", "https://hzqyihui.github.io/media/images/Talk.png");
menulist.eq(i).show();
} else if (iconurl == 'Friends') {
menulist.eq(i).attr("src", "https://hzqyihui.github.io/media/images/Friends.png");
menulist.eq(i).show();
} else if (iconurl == 'Fly') {
menulist.eq(i).attr("src", "https://hzqyihui.github.io/media/images/wind.png");
menulist.eq(i).show();
} else {
menulist.eq(i).attr("src", iconurl);
menulist.eq(i).show();
}
}
</script>
<!--------------------- 菜单栏图标加载功能👆 ----------------------->

<script>
    //--------------------bber-onetalk加载👇--------------------------------
    function bberonetalkLoad(){
        bberjsonurl = '';
        if ( $("#bber-talk").length > 0 ) {
        jsonUrl = bberjsonurl
        $.getJSON(jsonUrl+"?t="+Date.parse( new Date()),function(res){
        var bberHtml = ''
        $.each(res.data, function(i, item){
            d = new Date(item.date)
            date = d.getFullYear()+'/'+(d.getMonth()+1)+'/'+d.getDate() +' '+d.getHours()+':'+d.getMinutes()+':'+d.getSeconds()
            dataTime = '<span class="datatime">'+date+'</span>'
            bberHtml += '<li class="item item-'+(i+1)+'">'+dataTime+'： <a data-pjax href="https://hzqyihui.github.io/bber">'+item.content+'</a></li>'
        });
        $('#bber-talk').append('<span class="index-talk-icon"><svg viewBox="0 0 1024 1024" width="21" height="21"><path d="M184.32 891.667692c-12.603077 0-25.206154-2.363077-37.809231-7.876923-37.021538-14.966154-59.864615-49.624615-59.864615-89.009231v-275.692307c0-212.676923 173.292308-385.969231 385.969231-385.969231h78.76923c212.676923 0 385.969231 173.292308 385.969231 385.969231 0 169.353846-137.846154 307.2-307.2 307.2H289.083077l-37.021539 37.021538c-18.904615 18.116923-43.323077 28.356923-67.741538 28.356923zM472.615385 195.347692c-178.018462 0-322.953846 144.935385-322.953847 322.953846v275.692308c0 21.267692 15.753846 29.144615 20.48 31.507692 4.726154 2.363077 22.055385 7.876923 37.021539-7.08923l46.473846-46.473846c6.301538-6.301538 14.178462-9.452308 22.055385-9.452308h354.461538c134.695385 0 244.184615-109.489231 244.184616-244.184616 0-178.018462-144.935385-322.953846-322.953847-322.953846H472.615385z"></path><path d="M321.378462 512m-59.076924 0a59.076923 59.076923 0 1 0 118.153847 0 59.076923 59.076923 0 1 0-118.153847 0Z"></path><path d="M518.301538 512m-59.076923 0a59.076923 59.076923 0 1 0 118.153847 0 59.076923 59.076923 0 1 0-118.153847 0Z"></path><path d="M715.224615 512m-59.076923 0a59.076923 59.076923 0 1 0 118.153846 0 59.076923 59.076923 0 1 0-118.153846 0Z"></path></svg></span><ul class="talk-list">'+bberHtml+'</ul>')
        //Lately({ 'target': '#bber-talk .datatime' });
        });
        function Roll (){
        var list_li = $('.talk-list li'),cur_li = list_li.first(),last_li = list_li.last();
        last_li.after(cur_li);
        };
        setInterval(Roll,3000);
    }
    }
  //--------------------bber-onetalk加载👆--------------------------------
</script>

<script>
    var ClicksideState = 1
    var cur_readingmode = false
    function readingmode(){
        if (!cur_readingmode){
            if(menupos == 'left'){
                if(ClicksideState==1)
                menu_openclose1()
            }
            $("#tab1").fadeOut(50)
            $("#bg").fadeOut(50)
            $(".navbar").fadeOut(50)
            $(".markdownIt-TOC li a").css("color","black")
            cur_readingmode = true
        }else{
            if(menupos == 'left'){
                if(ClicksideState==0)
                    menu_openclose1()
            }
            $("#tab1").fadeIn(50)
            $("#bg").fadeIn(50)
            $(".navbar").fadeIn(50)
            $(".markdownIt-TOC li a").css("color","antiquewhite")
            cur_readingmode = false  
        }
    }
</script>


<!----夜间模式👇-->
<script>
    var moonlightState = false
    function moonlight(){
        if(!moonlightState){
            $("#bg").fadeOut(200)
            $('body').css("background","rgba(0,0,0,0.8)")
            $(".markdownIt-TOC li a").css("color","white")
            $(".text p, .text ul").css("color","white")
            $("#articlecontent").css("color","white")
            $(".post-copyright").css("background","rgba(10,10,10,0.5)")
            $('blockquote').css("background","rgba(10,10,10,0.6)")
            $("#articlecontent").css("background","rgba(10,10,10,0.5)")
            moonlightState = true
            $(".moon").attr("src","https://hzqyihui.github.io/media/images/sun.png")
        }else{
            $("#bg").show()
            $(".markdownIt-TOC li a").css("color","antiquewhite")
            $(".text p, .text ul").css("color","rgba(0, 0, 0, 0.7)")
            $("#articlecontent").css("color","black")
            $(".post-copyright").css("background","#f9f9f9")
            $('blockquote').css("background","#eff8f0")
            $("#articlecontent").css("background","white")
            $(".moon").attr("src","https://hzqyihui.github.io/media/images/moon.png")
            $('body').css("background","white")
            moonlightState = false
        }
    }
</script>
<!----夜间模式👆--></div>
            <!--------------- pc端菜单栏👆 ---------------->

            <!-- ----------------左侧菜单栏html 👇-------------------------------------->
            
            <div>
                <div id="tab1" class="tab">
                    <div class="bars">
                        <span></span>
                        <span></span>
                        <span></span>
                    </div>
                    <div class="close"></div>
                </div>
                <div class="col-md-1 col-lg-3"></div>
                <!-- main标签，pjax渲染时加载以下内容👇 -->
                <div id="main" class="col-xs-12 col-sm-12 col-md-12 col-lg-7" style="padding:0;">
                    <div class="readingmode" onclick="readingmode()">阅</div>
                    <link rel="stylesheet" href="https://hzqyihui.github.io/media/css/font-awesome.css">

<body>
    <div class="allcontent" id="postdetail">
        <div class="postshow postpadding" style="padding-bottom: 0;">
            
            <div class="postdetailimg">
                <img src="https://oss.maxhua.cn/surface_cover/v2-904505bcf0c424788f6028b8952aa2e7_720w.jpeg" class="postimage" style="cursor:auto">
            </div>
            <div class="postinfo-detail">
                <div class="postdate"><i class="fa fa-calendar"></i>2022-09-09</div>
                <div class="poststatus postdate"><i class="fa fa-clock-o"></i> 30 min read</div>
                <div class="posttag">
                    
                    <a data-pjax href="https://hzqyihui.github.io/tag/WIidKTvWf/" class="postlink">
                        <i class="fa fa-tag"></i> Elasticsearch
                    </a>
                    
                    <a data-pjax href="https://hzqyihui.github.io/tag/-2V0ijUUL8/" class="postlink">
                        <i class="fa fa-tag"></i> 搜索引擎
                    </a>
                    
                </div>
            </div>
            
        <div id="articlecontent">
            <div id="texttitle" style="text-align: center">
                <h2 id="ptitle">ElasticSearch学习：</h2>
                <!-- id 将作为查询条件 -->
                <div id="pl" style="display:none">https://hzqyihui.github.io/post/elasticsearch-xue-xi/</div>
                <div id="rootaddr" style="display:none">https://hzqyihui.github.io</div>
                
                    
                    <span id="hotnum">
                        <h4><i class="fa fa-eye" aria-hidden="true" style="color: #FF8C00;"></i>&nbsp;&nbsp;热度</i>: <i
                                class="hotnum">loading...</i></h4>
                    </span>
                    
                
            </div>
            <div class="text ">
                <h1 id="2elasticsearch安装">2.elasticsearch安装</h1>
<h2 id="21关闭并禁用防火墙">2.1.关闭并禁用防火墙</h2>
<pre><code>systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service
</code></pre>
<h2 id="22通过docker安装elasticsearch">2.2.通过docker安装elasticsearch</h2>
<p>Shell</p>
<pre><code>#新建es的config配置文件夹
mkdir -p /data/elasticsearch/config
mkdir -p /Users/maxhua/Applications/elasticsearch/config #macos
#新建es的data目录
mkdir -p /data/elasticsearch/data
mkdir -p /Users/maxhua/Applications/elasticsearch/data  #macos
#给目录设置权限
chmod 777 -R /data/elasticsearch
chmod 777 -R /Users/maxhua/Applications/elasticsearch  #macos

#写入配置到elasticsearch.yml中
echo &quot;http.host: 0.0.0.0&quot;&gt;&gt;/data/elasticsearch/config/elasticsearch.yml
echo &quot;http.host: 0.0.0.0&quot;&gt;&gt;/Users/maxhua/Applications/elasticsearch/config/elasticsearch.yml
#安装es
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e &quot;discovery.type=single-node&quot; \
-e ES_JAVA_OPTS=&quot;-Xms256m -Xmx1024m&quot; \
-v /data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /data/elasticsearch/data:/usr/share/elasticsearch/data \
-v /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.10.1

#macos 上docker安装
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e &quot;discovery.type=single-node&quot; \
-e ES_JAVA_OPTS=&quot;-Xms256m -Xmx1024m&quot; \
-v /Users/maxhua/Applications/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /Users/maxhua/Applications/elasticsearch/data:/usr/share/elasticsearch/data \
-v /Users/maxhua/Applications/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.14.2
</code></pre>
<h2 id="23通过docker安装kibana">2.3.通过docker安装kibana</h2>
<pre><code>docker run -d --name kibana -e ELASTICSEARCH_HOSTS=&quot;http://192.168.1.2:9200&quot; -p 5601:5601 kibana:7.14.2
</code></pre>
<p>kibana 和 elasticsearch 的版本号应该保持一致</p>
<h1 id="3-es中的-type-index-mapping-he-dsl">3. ES中的 type index, mapping he dsl</h1>
<p><img src="https://oss.maxhua.cn/es/mysql_and_es.png" alt="" loading="lazy"><br>
在 es 7里面， index 可以理解为 MySQL 的 table 了， 在7之前是 database，index 即是  table，  在 es 8之后 type就取消了</p>
<ol>
<li>索引<br>
有两个含义： 动词（insert），名词（表）<br>
Elasticsearch将它的数据存储到一个或者多个索引(index)中，索引就像数据库，可以向索引写入文档或者从索引中读取文档。</li>
</ol>
<pre><code>PUT /movies/movie/1
{
    &quot;title&quot;:&quot;The Godfather&quot;,
    &quot;director&quot;:&quot;Francis Ford Coppola&quot;,
    &quot;year&quot;:1972,
    &quot;genres&quot;:[&quot;Crime&quot;,&quot;Drama&quot;]
}
</code></pre>
<ol start="2">
<li>文档<br>
文档(document)是Elasticsearch中的主要实体。所以，所有使用Elasticsearchi最终都会归结到文档的搜索上从客户端看，文档就是一个JSON对象，文档由字段构成，每个字段包含字段名以及一个或多个字段值。文档之间可能有各自不同的字段集合，文档没有固定的模式或强制的结构。</li>
<li>类型(7.x开始取消)<br>
Elasticsearch中每个文档都有与之对应的类型(type)定义，允许在一个索引存储多种文档类型，并提供不同映射。类型就像一个数据库表</li>
<li>映射映射做的就是，存储分析链所需的信息。主要就是设置一些参数，根据这些参数来做过滤还是分割词条。</li>
</ol>
<h1 id="4-新建数据">4. 新建数据</h1>
<p>在kibana的 console中写命令，就相当于是在执行HTTP命令，比如<br>
GET _cat/indices<br>
<img src="https://oss.maxhua.cn/es/es_new_data.png" alt="" loading="lazy"><br>
类似于执行http请求</p>
<pre><code>http://127.0.0.1:9200/_cat/indices
</code></pre>
<h2 id="41通过putid新建数据">4.1.通过put+id新建数据</h2>
<p>在<code>customer</code>下保存id为<code>1</code>的数据，这里id是必须的</p>
<pre><code>往索引index里添加id为1 的数据，中间的 _doc是写死的，为 type 的意思
put  index/_doc/1  
</code></pre>
<pre><code>PUT /account/doc/1
{
    &quot;name&quot;:&quot;bobby&quot;,
    &quot;age&quot;:18,
        &quot;company&quot;:{
            &quot;name&quot;:&quot;imooc&quot;,
            &quot;address&quot;:&quot;beijing&quot;
        }
}
</code></pre>
<p>结果：</p>
<pre><code>{
  &quot;_index&quot; : &quot;account&quot;,
  &quot;_type&quot; : &quot;_doc&quot;,
  &quot;_id&quot; : &quot;1&quot;,
  &quot;_version&quot; : 1,
  &quot;result&quot; : &quot;created&quot;,
  &quot;_shards&quot; : {  //分片
    &quot;total&quot; : 2,
    &quot;successful&quot; : 1,
    &quot;failed&quot; : 0
  },
  &quot;_seq_no&quot; : 0,  //乐观锁
  &quot;_primary_term&quot; : 1
}
</code></pre>
<h2 id="42-发送post不带id新建数据">4.2. 发送post不带id新建数据</h2>
<pre><code>POST user/_doc/
{
    &quot;name&quot;:&quot;bobby I
}
POST user/_doc/2
{
    &quot;name&quot;:&quot;bobby&quot;
}
</code></pre>
<p>POST操作，带了id后，就和PUT带ID的作用（更新）一样了，PUT是不允许不带ID的。<br>
POST和PUT的更新是全量更新，传的值会整体覆盖以前的数据。</p>
<h2 id="43-post-create">4.3 post create</h2>
<p>没有就创建，有就报错</p>
<pre><code>POST user/_create/1
{
    &quot;name&quot;:&quot;bobby&quot;
}
</code></pre>
<p>查看index</p>
<pre><code>GET cat/_indices//查看所有索引
GET/account/查看index的基本信息
</code></pre>
<h1 id="5-获取数据">5. 获取数据</h1>
<h2 id="51-获取数据">5.1 获取数据</h2>
<pre><code>GET user/_doc/1
{
    &quot;_index&quot;:&quot;usen&quot;,/所属
    &quot;_type&quot;:&quot;_doc&quot;,
    &quot;_id&quot;:&quot;1&quot;,
    &quot;_version&quot;:11,#版本号
    ”_seq_no&quot;:10,#并发控制，用于乐观锁
    &quot;_primary_term&quot;:1,#_seq_no,主分片重新分配，如重启，就会变化
    &quot;found&quot;true,
    &quot;_source&quot;:{
        &quot;name&quot;:&quot;bobby&quot;
    }
}
</code></pre>
<p>只返回source的值</p>
<pre><code>GET user/_source/1
{#结果
  &quot;name&quot; : &quot;max&quot;,
  &quot;company&quot; : &quot;i&quot;
}
</code></pre>
<h2 id="52-搜索数据">5.2 搜索数据</h2>
<p>ES有两种查询方式</p>
<pre><code>1. URI带有查询条件（轻量查询》
    查询能力有限，不是所有的查询都可以使用此方式
2.请求体中带有查询条件（复杂查询）
    查询条件以JSON格式表现，作为查询请求的请求体，适合复杂的查询
url查询
</code></pre>
<h3 id="521-通过url查询数据">5.2.1 通过urL查询数据</h3>
<p>请求参数位于_search端点之后，参数之间使用&amp;分割，例如：</p>
<pre><code>GET /_search?pretty&amp;q=title:azure&amp;explain=true&amp;from=1&amp;size=10&amp;sort=title:asc&amp;fields:user,title,con
GET _search?q=max #不指定索引，直接查
GET /user/_search?q=max  # 指定索引为 user， 都是典型的 restful 风格的接口
</code></pre>
<h3 id="522通过request-body查询数据-平时经常用到且重要">5.2.2通过request body查询数据 (平时经常用到，且重要)</h3>
<pre><code>#以下为基本查询
GET account/_search
{
    &quot;query&quot;:{
        &quot;match_all&quot;:{}
    }
}
</code></pre>
<h1 id="6-更新和删除数据">6. 更新和删除数据</h1>
<h2 id="61-想要给已有的数据新增字段">6.1 想要给已有的数据新增字段</h2>
<p>#什么都不做</p>
<pre><code>#这种方式的更新，会做检查，看所传值和已存在的值是否改变，决定是否更新
POST user/_update/2
{
    &quot;doc&quot;:{
        &quot;age&quot;:18
    }
}

#这种方式的更新，不会做检查，直接更新
POST user/_doc/2
{
   &quot;age&quot;:18
}
</code></pre>
<h2 id="62-删除数据和索引">6.2 删除数据和索引</h2>
<pre><code>#删除数据
DELETE user/_doc/1

#删除整个索引
DELETE user
</code></pre>
<h1 id="7-批量插入和批量查询">7. 批量插入和批量查询</h1>
<h2 id="71-批量插入bulk">7.1 批量插入（bulk）</h2>
<pre><code>POST _bulk
#如果下面的json里没有 _index 字段，也可以这样使用
POST user/_bulk
{&quot;index&quot;:{&quot;_index&quot;:&quot;test&quot;,&quot;_id&quot;:&quot;1&quot;}}
{&quot;field1&quot;:&quot;value1&quot;}

{&quot;delete&quot;:{&quot;_index&quot;:&quot;test&quot;,&quot;_id&quot;:&quot;2&quot;}}

{&quot;create&quot;:{&quot;_index&quot;:&quot;test&quot;,&quot;_id&quot;:&quot;3&quot;}}
{&quot;field1&quot;:&quot;value3&quot;}

{&quot;update&quot;:{&quot;_id&quot;:&quot;1&quot;,&quot;_index&quot;:&quot;test&quot;}}
{&quot;doc&quot;:{&quot;field2&quot;:&quot;value2&quot;}}
</code></pre>
<h2 id="72-批量获取">7.2 批量获取</h2>
<pre><code>GET /_mget
#如果下面的json里没有 _index 字段，也可以这样使用
POST user/_mget
{
    &quot;docs&quot;:[
        {
            &quot;_index&quot;:&quot;my-index-000001&quot;,
            &quot;_id&quot;:&quot;1&quot;
        },
        {
            &quot;_index&quot;:&quot;my-index-000001&quot;,
            &quot;_id&quot;:&quot;2&quot;
        }
   ]
}
</code></pre>
<h1 id="8-query-dsl-查询">8. query dsl 查询</h1>
<h2 id="81-一个完整的查询语句应该-如何写">8.1 一个完整的查询语句应该 如何写？</h2>
<p>以下为官方参考文档<br>
<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html</a></p>
<h2 id="82-全文查询的方法-分词倒排索引">8.2 全文查询的方法 - 分词，倒排索引</h2>
<h3 id="821-match查询匹配查询">8.2.1 match查询（匹配查询）</h3>
<p><strong>match:</strong> 模糊匹配，需要指定字段名，但是输入会进行分词，比如&quot;hello world&quot;会进行拆分为hello和world, 然后匹配，如果字段中包含hello或者world,或者都包含的结果都会被查询出来，也就是说match是一个部分匹配的模糊查询。查询条件相对来说比较宽松。</p>
<pre><code>#对于es来说， from 和 size分页在数据量比较小的情况下可行，scroll
GET user/_search
{
    &quot;query&quot;:{
        &quot;match_all&quot;:{}
    },
    &quot;from&quot;:0,
    &quot;size&quot;: 20
}
</code></pre>
<pre><code>#大小写不敏感，这是最简单的匹配查询
GET user/_search
{
  &quot;query&quot;: {
    &quot;match&quot;: {
      &quot;name&quot;: &quot;Max2&quot;
    }
  }
}
</code></pre>
<p><img src="https://oss.maxhua.cn/es/es_match.png" alt="" loading="lazy"><br>
<img src="https://oss.maxhua.cn/es/es_match_2.png" alt="" loading="lazy"></p>
<h3 id="822-match_phrase查询短语查询">8.2.2 match_phrase查询（短语查询）</h3>
<p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query-phrase.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query-phrase.html</a><br>
<strong>match_phase：</strong> 会对输入做分词，但是需要结果中也包含所有的分词，而且顺序要求一样。以&quot;hello<br>
world&quot;为例，要求结果中必须包含hello和world,而且还要求他们是连着的，顺序也是固定的，hello that word不满足，world hello也不满足条件。</p>
<pre><code>GET user/_search
{
  &quot;query&quot;: {
    &quot;match_phrase&quot;: {
      &quot;name&quot;: &quot;Max2&quot;
    }
  }
}
</code></pre>
<h3 id="823multi-match查询">8.2.3.multi match查询</h3>
<p><strong>multi_match：</strong> 查询提供了一个简便的方法用来对多个字段执行相同的查询，即对指定的多个字段进行match查询</p>
<pre><code>POST resume/doc/12
{
    &quot;title&quot;:&quot;后端工程师&quot;,
    &quot;desc&quot;:&quot;多年go语言开发经验，熟悉go的基本语法，熟悉常用的go语言库&quot;,
    &quot;want_learn&quot;:&quot;python语言&quot;
}
POST resume/doc/13
{
    &quot;title&quot;:&quot;go工程师&quot;,
    &quot;desc&quot;:&quot;多年开发经验&quot;,
    &quot;want_learn&quot;:&quot;java语言&quot;
}
POST resume/_doc/14
{
    &quot;title&quot;:&quot;后端工程师&quot;,
    &quot;desc&quot;:&quot;多年go语言开发经验，熟悉go的基本语法，熟悉常用的go语言库&quot;,
    &quot;want_learn&quot;:&quot;pythoni语言&quot;
}
POST account/_doc/15
{
    &quot;title&quot;:&quot;后端工程师&quot;,
    &quot;desc&quot;:&quot;多年开发经验&quot;,
    &quot;want_learn&quot;:&quot;rust语言&quot;
}

#最后来执行搜索
# 意义： 搜索title 和 desc 字段中包含 go 关键字的数据
# ^3，代表该字段的权重，会把 score 乘以 3倍后再进行返回，会导致顺序变化
GET resume/_search
{
  &quot;query&quot;: {
    &quot;multi_match&quot;: {
      &quot;query&quot;: &quot;go&quot;,
      &quot;fields&quot;: [&quot;title&quot;,&quot;desc^3&quot;]
    }
  }
}
</code></pre>
<h3 id="824-query_string查询">8.2.4 query_string查询</h3>
<p><strong>query_string:</strong> 和 match 类似，但是match需要指定字段名，query_string是在所有字段中搜索，范围更广泛。</p>
<pre><code>#query 字段中的 AND  和 OR 是代表对多个单词，是执行 一起匹配还是 单个分词的匹配，如果要用 AND 或者 OR 对整个字符串
#进行搜索，可以把字符串用()包起来
GET user/_search
{
  &quot;query&quot;: {
    &quot;query_string&quot;: {
      &quot;default_field&quot;: &quot;{field}&quot;,  //默认的查询字段， 不加的话，就会查所有字段
      &quot;query&quot;: &quot;this AND that OR thus&quot;  //可以使用
    }
  }
}
</code></pre>
<h2 id="83-match_all查询">8.3 match_all查询</h2>
<pre><code>#对于es来说， from 和 size分页在数据量比较小的情况下可行，scroll
GET user/_search
{
    &quot;query&quot;:{
        &quot;match_all&quot;:{}
    },
    &quot;from&quot;:0,
    &quot;size&quot;: 20
}
</code></pre>
<h2 id="84-term级别查询">8.4 term级别查询</h2>
<h3 id="841-term查询-和match查询不同match会分词">8.4.1 term查询 （和match查询不同，match会分词）</h3>
<p><strong>term:</strong> 这种查询和match在有些时候是等价的，比如我们查询单个的词hello,那么会和matchi查询结果一样，但是如果查询&quot;hello world&quot;,结果就相差很大，因为<code>这个输入不会进行分词</code>，就是说查询的时候，是查询字段分词结果中是否有&quot;hello world&quot;的字样，而不是查询字段中包含&quot;hello world&quot;的字样，elasticsearch会对字段内容进行分词，&quot;hello world&quot;会被分成hello和world,不存在&quot;hello world&quot;,因此这里的查询结果会为空。这也是term查询和match的区别。</p>
<pre><code>GET /_search
{
  &quot;query&quot;: {
    &quot;term&quot;: {
      &quot;user.id&quot;: { //user.id 代表数据中 user 字段下的 id 字段
        &quot;value&quot;: &quot;kimchy&quot;,  //其值为 kimchy
        &quot;boost&quot;: 1.0   //权重为 1 ， 和 multi_match 那里类似
      }
    }
  }
}
</code></pre>
<h3 id="842-range查询">8.4.2 range查询</h3>
<p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html</a></p>
<pre><code>GET /_search
{
  &quot;query&quot;: {
    &quot;range&quot;: {
      &quot;age&quot;: {
        &quot;gte&quot;: 10,
        &quot;lte&quot;: 20,
        &quot;boost&quot;: 2.0
      }
    }
  }
}
</code></pre>
<h3 id="843-exist查询">8.4.3 exist查询</h3>
<p>查出有字段user的数据</p>
<pre><code>GET /_search
{
  &quot;query&quot;: {
    &quot;exists&quot;: {
      &quot;field&quot;: &quot;user&quot;
    }
  }
}
</code></pre>
<p>查出没有有字段user的数据</p>
<pre><code>GET /_search
{
  &quot;query&quot;: {
    &quot;bool&quot;: {
      &quot;must_not&quot;: {
        &quot;exists&quot;: {
          &quot;field&quot;: &quot;user.id&quot;
        }
      }
    }
  }
}
</code></pre>
<h3 id="844-模糊查询">8.4.4 模糊查询</h3>
<pre><code>GET /_search
{
  &quot;query&quot;: {
    &quot;fuzzy&quot;: {
      &quot;user.id&quot;: {
        &quot;value&quot;: &quot;ki&quot;
      }
    }
  }
}

#或者下面的用法，也可以给 match开启模糊查询
GET /_search
{
  &quot;query&quot;: {
    &quot;match&quot;: {
      &quot;address&quot;: {
        &quot;query&quot;: &quot;street&quot;,
        &quot;fuzziness&quot;:1
      }
    }
  }
}
</code></pre>
<h2 id="85-复合查询">8.5 复合查询</h2>
<p>Elasticsearch <code>bool</code>查询对应<code>Lucene BooleanQuery</code>,格式如下</p>
<pre><code>GET user/_search
{
  &quot;query&quot;: {
    &quot;bool&quot;: {
      &quot;must&quot;: [
        {
          &quot;term&quot;: {
            &quot;state&quot;: {
              &quot;value&quot;: &quot;tn&quot;
            }
          }
        },
        {
          &quot;range&quot;: {
            &quot;age&quot;: {
              &quot;gte&quot;: 10,
              &quot;lte&quot;: 30
            }
          }
        }
      ],
      &quot;must_not&quot;: [
        {
          &quot;term&quot;: {
            &quot;gender&quot;: {
              &quot;value&quot;: &quot;m&quot;
            }
          }
        }
      ],
      &quot;should&quot;: [
        {
          &quot;match&quot;: {
            &quot;firstname&quot;: &quot;docker&quot;
          }
        }
      ],
      &quot;filter&quot;: [
        {
          &quot;range&quot;: {
            &quot;age&quot;: {
              &quot;gte&quot;: 25,
              &quot;lte&quot;: 30
            }
          }
        }
      ]
    }
  }
}
must:必须匹配，查询上下文，加分
should:应该匹配，查询上下文，加分
must_not:必须不匹配，过滤上下文，过滤
fi1ter:必须匹配，过滤上下文，过滤
</code></pre>
<p><code>bool</code>查询采用了一种匹配越多越好的方法，因此每个匹配的must或should子句的分数将被加在一起，以提供每个文档的最终得分</p>
<h1 id="9-mapping">9. mapping</h1>
<h2 id="91-什么是mapping">9.1 什么是Mapping?</h2>
<p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html</a><br>
在一篇文章带你搞定ElasticSearch术语中，我们讲到了Mapping类似于数据库中的表结构定义schema,它<br>
有以下几个作用：<br>
<strong>定义索引中的字段的名称定义字段的数据类型，比如字符串、数字、布尔字段，倒排<br>
索引的相关配置，</strong> 比如设置某个字段为不被索引、记录position等在ES早期版本，一个索引下<br>
是可以有多个Type,从7.0开始，一个索引只有一个Type,也可以说一个Type有一个Mapping定义。<br>
在了解了什么是Mapping之后，接下来对Mapping的设置做下介绍：<br>
Mapping设置</p>
<pre><code>PUT users
{
    &quot;mappings&quot;:{
        &quot;_doc&quot;:{
            &quot;dynamic&quot;:false
        }
    }
}
</code></pre>
<p>在创建一个索引的时候，可以对dynamic进行设置，可以设成false、true或者strict。<br>
<img src="https://oss.maxhua.cn/es/es_mapping.png" alt="" loading="lazy"><br>
比如一个新的文档，这个文档包含一个字段，当Dynamic设置为true时，这个文档可以被索引进ES,这个<br>
字段也可以被索引，也就是这个字段可以被搜索，Mapping也同时被更新；当dynamic被设置为false时候，存在新增字段的数据写入，该数据可以被索引，但是新增字段被丢弃；当设置成strict模式时候，数据写入直接出错。</p>
<p>可以用这个对某个索引进行修改字段的属性，如果type是 keyword 值，那么在查询的时候，就不会分词，需要全匹配，如果是 text，就会分词。</p>
<pre><code>PUT usertest
{
  &quot;mappings&quot;: {
    &quot;properties&quot;: {
      &quot;age&quot;:{
        &quot;type&quot;: &quot;integer&quot;,
        &quot;analyzer&quot;:&quot;whitespace&quot;, //可以直接设置分词器，如果不指明，则采用默认分词器
        &quot;search_analyzer&quot;:&quot;simple&quot;  //还可以指明search时候的 分词器
      },
      &quot;name&quot;:{
        &quot;type&quot;: &quot;text&quot;
      },
      &quot;desc&quot;:{
        &quot;type&quot;: &quot;keyword&quot;
      }
    }
  }
}
</code></pre>
<h1 id="10-elasticsearch-analyzer详解">10.  Elasticsearch Analyzer详解</h1>
<p>Elasticsearch 中文本分析<code>Analysis</code>是把全文本转换成一系列的单词(term/token)的过程，也叫分词。文本分析是使用分析器<code>Analyzer</code>来实现的，Elasticsearch内置了分析器，用户也可以按照自己的需求自定义分析器。</p>
<p>为了提高搜索准确性，除了在数据写入时转换词条，匹配Query语句时候也需要用相同的分析器对查询语句进行<br>
分析。</p>
<h2 id="101-analyzer的组成">10.1 Analyzer的组成</h2>
<p>Analyzer由三部分组成：Character Filters、Tokenizer、Token Filters</p>
<h3 id="1011-character-filters">10.1.1 Character Filters</h3>
<p>Character Filters字符过滤器接收原始文本text的字符流，可以对原始文本增加、删除字段或者对字符做转<br>
换。一个Analyzer分析器可以有0-n个按顺序执行的字符过滤器。</p>
<h3 id="1012-tokenizer">10.1.2 Tokenizer</h3>
<p>Tokenizer 分词器接收 Character Filters 输出的字符流，将字符流分解成的那个的单词，并且输出单词流。例如<br>
空格分词器会将文本按照空格分解，将&quot;Quick brown fox!&quot;转换成[Quick,brown,fox!]。分词器也负责记录每个<br>
单词的顺序和该单词在原始文本中的起始和结束偏移offsets。<br>
一个 <strong>Analyzer分析器</strong> 有且只有1个分词器。</p>
<h3 id="1013-token-filters">10.1.3 Token Filters</h3>
<p>Token Filter单词过滤器接收分词器Tokenizer输出的单词流，可以对单词流中的单词做添加、移除或者转换操<br>
作，例如lowercase token filters会将单词全部转换成小写，stop token filters会移除the、and这种通用单<br>
词，synonym token filter会往单词流中添加单词的同义词。<br>
Token filters不允许改变单词在原文档的位置以及起始、结束偏移量。<br>
一个Analyzer分析器可以有0-n个按顺序执行的单词过滤器。<br>
<img src="https://oss.maxhua.cn/es/es_token_filter.png" alt="" loading="lazy"></p>
<h2 id="102-elasticsearch内置的分词器">10.2 Elasticsearch内置的分词器</h2>
<pre><code>Standard Analyzer-默认分词器，按词切分，小写处理
Simple Analyzer-按照非字母切分（符号被过滤），小写处理
Stop Analyzer-小写处理，停用词过滤(the,a,is)
Whitespace Analyzer-按照空格切分，不转小写
Keyword Analyzer-不分词，直接将输入当做输出
Patter Analyzer-正则表达式，默认IW+
Language-提供了30多种常见语言的分词器
</code></pre>
<p>例子：The2 QUICK Brown-Foxes jumped over the lazy dog's bone..</p>
<h3 id="1021-standard-analyzer">10.2.1 Standard Analyzer</h3>
<p>·默认分词器<br>
·按词分类<br>
·小写处理</p>
<pre><code>#standard ,可以看分词后的效果
GET _analyze
{
 &quot;analyzer&quot;:&quot;standard&quot;,
 &quot;text&quot;:&quot;The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.&quot;
}
</code></pre>
<p>输出：</p>
<pre><code>[the,2,quick,brown,foxes,a,jumped,over,the,lazy,dog's,bone]
</code></pre>
<h3 id="1022-simple-analyzer">10.2.2 Simple Analyzer</h3>
<p>·按照非字母切分，非字母则会被去除<br>
·小写处理</p>
<pre><code>#simple
GET _analyze
{
 &quot;analyzer&quot;:&quot;simple&quot;,
 &quot;text&quot;:&quot;The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.&quot;
}
</code></pre>
<p>输出：</p>
<pre><code>[the,quick,brown,foxes,jumped,over,the,lazy,dog,s,bone]
</code></pre>
<h3 id="1023-stop-analyzer">10.2.3 Stop Analyzer</h3>
<p>小写处理，停用词过滤(the,a,is)<br>
#simple</p>
<pre><code>GET _analyze
{
 &quot;analyzer&quot;:&quot;stop&quot;,
 &quot;text&quot;:&quot;The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.&quot;
}
</code></pre>
<p>输出：</p>
<pre><code>[quick,brown,foxes jumped,over,lazy,dog,s,bone]
</code></pre>
<h3 id="1024-whitespace-analyzer">10.2.4 Whitespace Analyzer</h3>
<p>按照空格切分，不转小写</p>
<pre><code>#simple
GET _analyze
{
 &quot;analyzer&quot;:&quot;whitespace&quot;,
 &quot;text&quot;:&quot;The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.&quot;
}
</code></pre>
<p>输出：</p>
<pre><code>[The,2,QUICK,Brown-Foxes,jumped,over,the,lazy,dog's,bone.]
</code></pre>
<h3 id="1025-keyword-analyzer">10.2.5 Keyword Analyzer</h3>
<p>不分词，直接将输入当做输出</p>
<pre><code>#simple
GET _analyze
{
 &quot;analyzer&quot;:&quot;keyword&quot;,
 &quot;text&quot;:&quot;The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.&quot;
}
</code></pre>
<p>输出：</p>
<pre><code>[The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.]
</code></pre>
<h3 id="1026-patter-analyzer">10.2.6 Patter Analyzer</h3>
<p>正则表达式，默认IW+<br>
通过正则表达式进行分词</p>
<pre><code>#simple
GET _analyze
{
 &quot;analyzer&quot;:&quot;pattern&quot;,
 &quot;text&quot;:&quot;The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.&quot;
}
</code></pre>
<p>输出：</p>
<pre><code>[the,2,quick,brown,foxesjumped,over,the,lazy,dog,s,bone]
</code></pre>
<h3 id="1027-language-analyzer">10.2.7 Language Analyzer</h3>
<p>提供了30多种常见语言的分词器<br>
支持语言：arabic,armenian,basque,bengali,,bulgarian,catalan,,czech,dutch,english,finnish,french,galician,<br>
german,hindi,hungarian,indonesian,irish,italian,latvian,lithuanian,norwegian,portuguese,romanian,russian,<br>
sorani,spanish,swedish,turkish.</p>
<pre><code>#simple
GET _analyze
{
 &quot;analyzer&quot;:&quot;english&quot;,
 &quot;text&quot;:&quot;The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.&quot;
}
</code></pre>
<p>输出：</p>
<pre><code>[2,quickown,fox,jump,over,the,lazy,dog,bone]
</code></pre>
<p>中文分词要比英文分词难，英文都以空格分隔，中文理解通常需要上下文理解才能有正确的理解，比如苹果，不大好吃 和 苹果，不大，好吃吻，这两句意思就不一样。</p>
<h3 id="1028-icu-analyzer">10.2.8 ICU Analyzer</h3>
<p>ElasticSearch默认以每个字对中文分隔，无法满足我们的需求。ICU Analyzer使用国际化组件Unicode(ICU)函数<br>
库提供丰富的处理Unicode,更好支持中文分词，ICU Analyzer不是默认分词器，需要先安装插件，安装命令</p>
<pre><code>sudo bin/elasticsearch-plugin install analysis-icu
</code></pre>
<pre><code>#simple
GET _analyze
{
 &quot;analyzer&quot;:&quot;icu_analyzer&quot;,
 &quot;text&quot;:&quot;他说的确实在理&quot;
}
</code></pre>
<p>输出：</p>
<pre><code>[他, 说的, 确实, 在, 理]
</code></pre>
<p>常用的插件分词器</p>
<pre><code>IK Analyzer-对中文分词友好，支持远程词典热更新，有ik_smart、ik_max_word两种分析器
pinyin Analyzer-可以对中文进行拼音分析，搜索时使用拼音即可搜索出来对应中文
ICU Analyzer-提供了Unicode的支持，更好的支持亚洲语言
hanLP Analyzer-基于NLP的中文分析器
</code></pre>
<h1 id="11-分词的重要性">11. 分词的重要性</h1>
<h2 id="111-文本分词">11.1 文本分词</h2>
<p>单词是语言中重要的基本元素。一个单词可以代表一个信息单元，有着指代名称、功能、动作、性质等作<br>
用。在语言的进化史中，不断有新的单词涌现，也有许多单词随着时代的变迁而边缘化直至消失。根据统计，<br>
《汉语词典》中包含的汉语单词数目在37万左右，《牛津英语词典》中的词汇约有17万。</p>
<p>理解单词对于分析语言结构和语义具有重要的作用。因此，在机器阅读理解算法中，模型通常需要首先对语<br>
句和文本进行单词分拆和解析。</p>
<p>分词(tokenization)的任务是将文本以单词为基本单元进行划分。由于许多词语存在词型的重叠，以及组合<br>
词的运用，解决歧义性是分词任务中的一个挑战。不同的分拆方式可能表示完全不同的语义。如在以下例子中，<br>
两种分拆方式代表的语义都有可能：</p>
<pre><code>#查看es 会对 中华牙膏，怎么分词
GET _analyze
{
  &quot;text&quot;: &quot;中华牙膏&quot;
}
#结果
{
  &quot;tokens&quot; : [
    {
      &quot;token&quot; : &quot;中&quot;,
      &quot;start_offset&quot; : 0,
      &quot;end_offset&quot; : 1,
      &quot;type&quot; : &quot;&lt;IDEOGRAPHIC&gt;&quot;,
      &quot;position&quot; : 0
    },
    {
      &quot;token&quot; : &quot;华&quot;,
      &quot;start_offset&quot; : 1,
      &quot;end_offset&quot; : 2,
      &quot;type&quot; : &quot;&lt;IDEOGRAPHIC&gt;&quot;,
      &quot;position&quot; : 1
    }
  ]
}
</code></pre>
<h2 id="112-分词的意义-nlp">11.2 分词的意义 （NLP）</h2>
<h3 id="1121-将复杂问题转化为数学问题">11.2.1 将复杂问题转化为数学问题</h3>
<p>在机器学习的文章中讲过，机器学习之所以看上去可以解决很多复杂的问题，是因为它把这些问题都转化为了数学问题。而NLP也是相同的思路，文本都是一些「非结构化数据」，我们需要先将这些数据转化为「结构化数据」，结构化数据就可以转化为数学问题了，而分词就是转化的第一步。</p>
<h3 id="1122-词是一个比较合适的粒度">11.2.2 词是一个比较合适的粒度</h3>
<p>词是表达完整含义的最小单位。</p>
<p>字的粒度太小，无法表达完整含义，比如”鼠“可以是”老鼠“，也可以是”鼠标“。</p>
<p>而句子的粒度太大，承载的信息量多，很难复用。比如”传统方法要分词，一个重要原因是传统方法对远距离依赖的建模能力较弱。&quot;</p>
<h2 id="113-中英文分词的3个典型区别">11.3 中英文分词的3个典型区别</h2>
<p><strong>区别1：</strong> 分词方式不同，中文更难<br>
英文有天然的空格作为分隔符，但是中文没有。所以如何切分是一个难点，再加上中文里一词多意的情况非<br>
常多，导致很容易出现歧义。下文中难点部分会详细说明。<br>
<strong>区别2：</strong> 英文单词有多种形态<br>
英文单词存在丰富的变形变换。为了应对这些复杂的变换，英文NLP相比中文存在一些独特的处理步骤，我<br>
们称为词形还原(Lemmatization)和词干提取(Stemming)。中文则不需要<br>
词性还原：does,done,doing,did需要通过词性还原恢复成do。<br>
词干提取：cities,children,teeth这些词，需要转换为city,child,tooth”这些基本形态<br>
<strong>区别3：</strong> 中文分词需要考虑粒度问题<br>
例如「中国科学技术大学」就有很多种分法：</p>
<pre><code>中国科学技术大学
中国\科学技术\大学
中国\科学\技术\大学
</code></pre>
<p>粒度越大，表达的意思就越准确，但是也会导致召回比较少。所以中文需要不同的场景和要求选择不同的粒度。这个在英文中是没有的。</p>
<h2 id="114-中文分词的3大难点">11.4 中文分词的3大难点</h2>
<p><strong>难点1：没有统一的标准</strong><br>
目前中文分词没有统一的标准，也没有公认的规范。不同的公司和组织各有各的方法和规则<br>
<strong>难点2：歧义词如何切分</strong><br>
例如「兵乓球拍卖完了」就有2种分词方式表达了2种不同的含义：</p>
<pre><code>乒乓球\拍卖\完了
乒乓\球拍\卖\完了
</code></pre>
<p><strong>难点3：新词的识别</strong><br>
信息爆炸的时代，三天两头就会冒出来一堆新词，如何快速的识别出这些新词是一大难点。比如当年「蓝瘦香菇」大火，就需要快速识别。</p>
<h2 id="115-3种典型的分词方法">11.5 3种典型的分词方法</h2>
<p>分词的方法大致分为3类：</p>
<pre><code>a.基于词典匹配
b.基于统计
C.基于深度学习
</code></pre>
<p><strong>给予词典匹配的分词方式</strong><br>
优点：速度快、成本低<br>
缺点：适应性不强，不同领域效果差异大<br>
基本思想是基于词典匹配，将待分词的中文文本根据一定规则切分和调整，然后跟词典中的词语进行匹配，匹配成功则按照词典的词分词，匹配失败通过调整或者重新选择，如此反复循环即可。代表方法有基于正向最大匹配和基于逆向最大匹配及双向匹配法。</p>
<p><strong>基于统计的分词方法</strong><br>
优点：适应性较强<br>
缺点：成本较高，速度较慢<br>
这类目前常用的是算法是HMM、CcRF、SVM、深度学习等算法，比如stanford、Hanlp?分词工具是基于CRF算<br>
法。以CF为例，基本思路是对汉字进行标注训练，不仅考虑了词语出现的频率，还考虑上下文，具备较好的学习<br>
能力，因此其对歧义词和未登绿词的识别都具有良好的效果。</p>
<p><strong>基于深度学习</strong><br>
优点：准确率高、适应性<br>
缺点：成本高，速度慢<br>
例如有人员尝试使用双向LSTM+CF实现分词器，其本质上是序列标注，所以有通用性，命名实体识别等都可以使用该模型，据报道其分词器字符准确率可高达97.5%。<br>
常见的分词器都是使用机器学习算法和词典相结合，一方面能够提高分词准确率，另一方面能够改善领域适应性。</p>
<h2 id="116-中文分词工具">11.6 中文分词工具</h2>
<p>下面排名根据GitHub上的star数排名：</p>
<ol>
<li>jieba</li>
<li>Hanlp</li>
<li>IK</li>
<li>Stanford分词</li>
<li>ansj分词器</li>
<li>哈工大LTP</li>
<li>KCWS分词器</li>
<li>清华大学THULAC</li>
<li>ICTCLAS</li>
</ol>
<h2 id="117-英文分词工具">11.7 英文分词工具</h2>
<ol>
<li>Keras</li>
<li>Spacy</li>
<li>Gensim</li>
<li>NLTK</li>
</ol>
<h2 id="118-总结">11.8 总结</h2>
<p>分词就是将句子、段落、文章这种长文本，分解为以字词为单位的数据结构，方便后续的处理分析工作。<br>
<strong>分词的原因：</strong></p>
<ol>
<li>将复杂问题转化为数学问题</li>
<li>词是一个比较合适的粒度</li>
<li>深度学习时代，部分任务中也可以「分字」</li>
</ol>
<p><strong>中英文分词的3个典型区别：</strong></p>
<ol>
<li>分词方式不同，中文更难</li>
<li>英文单词有多种形态，需要还原和词干提取</li>
<li>中文分词需要考虑粒度问题</li>
</ol>
<p><strong>中文分词的3大难点</strong></p>
<ol>
<li>没有统一的标准</li>
<li>歧义词如何切分</li>
<li>新词的识别</li>
</ol>
<p><strong>3个典型的分词方式：</strong></p>
<ol>
<li>基于词典匹配</li>
<li>基于统计</li>
<li>基于深度学习</li>
</ol>
<h1 id="12-ik分词器安装和配置">12. IK分词器安装和配置</h1>
<p>下载的版本一定要和ES版本一致。</p>
<pre><code>wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.14.2/elasticsearch-analysis-ik-7.14.2.zip
</code></pre>
<p>解压出来到 es的 plugins 文件夹下即可，并改文件夹名为 ik<br>
再执行</p>
<pre><code>chmod 777 -R ik
</code></pre>
<pre><code>GET _analyze
{
  &quot;text&quot;: &quot;中国科学技术大学&quot;,
  &quot;analyzer&quot;: &quot;ik_max_word&quot; //或者 ik_smart
}
#结果
{
  &quot;tokens&quot; : [
    {
      &quot;token&quot; : &quot;中国科学技术大学&quot;,
      &quot;start_offset&quot; : 0,
      &quot;end_offset&quot; : 8,
      &quot;type&quot; : &quot;CN_WORD&quot;,
      &quot;position&quot; : 0
    },
    {
      &quot;token&quot; : &quot;中国&quot;,
      &quot;start_offset&quot; : 0,
      &quot;end_offset&quot; : 2,
      &quot;type&quot; : &quot;CN_WORD&quot;,
      &quot;position&quot; : 1
    },
    {
      &quot;token&quot; : &quot;科学技术&quot;,
      &quot;start_offset&quot; : 2,
      &quot;end_offset&quot; : 6,
      &quot;type&quot; : &quot;CN_WORD&quot;,
      &quot;position&quot; : 2
    },
    {
      &quot;token&quot; : &quot;科学&quot;,
      &quot;start_offset&quot; : 2,
      &quot;end_offset&quot; : 4,
      &quot;type&quot; : &quot;CN_WORD&quot;,
      &quot;position&quot; : 3
    },
    {
      &quot;token&quot; : &quot;技术&quot;,
      &quot;start_offset&quot; : 4,
      &quot;end_offset&quot; : 6,
      &quot;type&quot; : &quot;CN_WORD&quot;,
      &quot;position&quot; : 4
    },
    {
      &quot;token&quot; : &quot;大学&quot;,
      &quot;start_offset&quot; : 6,
      &quot;end_offset&quot; : 8,
      &quot;type&quot; : &quot;CN_WORD&quot;,
      &quot;position&quot; : 5
    }
  ]
}
</code></pre>
<p>自己增加中文词库</p>
<pre><code>cd /Users/maxhua/Applications/elasticsearch/plugins/ik/config/
mkdir custom
</code></pre>
<p>自己建立一些文件，</p>
<pre><code>vim mydic.dic， 增加词库就完了
</code></pre>
<p>再重启容器</p>

            </div>
            <hr style="width: 80%;">
            
            <div class="donateContainer">
                <span class="donatebtn">赏</span>
            </div>
            <div class="donateContainer">
                <img src="https://oss.maxhua.cn/Wechat_shoukuanma.png" alt="" class="donate">
            </div>
            
            <div class="postfooter">
                <ul class="post-copyright">
                    <li><strong>文章作者：</strong>逸晖</li>
            <li><strong>原文链接：</strong>https://hzqyihui.github.io/post/elasticsearch-xue-xi/</li>
            <li><strong>版权声明：</strong>本博客所有文章除特别声明外，均采用<i class="fa fa-fw fa-creative-commons"></i>BY-NC-SA
                许可协议。转载请注明出处！</li>
            </ul>
        </div>
        
            <div class="shareContainer">
                <div class="share" style="height:30px;">
                    <a class="qq" href=""><i><img class="shareicon"
                                src="https://hzqyihui.github.io/media/images/qqs.png" alt=""></i></a>
                    <a class="wechat" href=""><i><img class="shareicon"
                                src="https://hzqyihui.github.io/media/images/wechats.png" alt=""></i></a>
                    <a class="weibo" href=""><i><img class="shareicon"
                                src="https://hzqyihui.github.io/media/images/weibos.png" alt=""></i></a>
                    <a class="qzone" href=""><i><img class="shareicon"
                                src="https://hzqyihui.github.io/media/images/qzones.png" alt=""></i></a>
                    <a class="douban" href=""><i><img class="shareicon"
                                src="https://hzqyihui.github.io/media/images/doubans.png" alt=""></i></a>
                    <a class="facebook" href=""><i><img class="shareicon"
                                src="https://hzqyihui.github.io/media/images/facebooks.png" alt=""></i></a>
                    <a class="twitter" href=""><i><img class="shareicon"
                                src="https://hzqyihui.github.io/media/images/twitter.png" alt=""></i></a>
                </div>
            </div>
            
        <div id="otherpost">
            
            <a  data-pjax class="prev-post-pc" href="https://hzqyihui.github.io/post/shi-wu-he-fen-bu-shi-shi-wu/"  style="color: black;">
                <div id="ppcontainer">
                    
                    <img src="https://oss.maxhua.cn/surface_cover/git-ming-ling-xing-ri-chang-zhi-ling.jpeg" style="width: 100%;" class="opimg">
                    
                    <h4 class="optitle">事务和分布式事务：</h4>
                </div>
            </a>
            <div class="prev-post">
                上一篇 <a  data-pjax href="https://hzqyihui.github.io/post/shi-wu-he-fen-bu-shi-shi-wu/">事务和分布式事务：</a>
            </div>
            
            
            <a data-pjax class="next-post-pc" href="https://hzqyihui.github.io/post/shi-me-shi-elasticsearch/"  style="color: black;">
                <div id="npcontainer">
                    
                    <img src="https://oss.maxhua.cn/surface_cover/k98jl6.png" style="width: 100%;" class="opimg">
                    
                    <h4 class="optitle">什么是elasticsearch</h4>
                </div>
            </a>
            <div class="next-post">
                下一篇 <a  data-pjax href="https://hzqyihui.github.io/post/shi-me-shi-elasticsearch/">什么是elasticsearch</a>
            </div>
            
        </div>
    </div>
    </div>
    </div>
    <!-- 弹窗 -->
    <div id="myModal" class="modal">
        <img class="modal-content" id="img01">
    </div>
</body>
<script>
    //文章阅读热度
    var pl = $("#pl").html();
    var rootaddr = $("#rootaddr").html();
    pl = pl.replace(rootaddr, "");
    $("#hotnum").attr('id', pl);
</script>
                    <div class="toc-container">
                        <ul class="markdownIt-TOC">
<li><a href="#2elasticsearch%E5%AE%89%E8%A3%85">2.elasticsearch安装</a>
<ul>
<li><a href="#21%E5%85%B3%E9%97%AD%E5%B9%B6%E7%A6%81%E7%94%A8%E9%98%B2%E7%81%AB%E5%A2%99">2.1.关闭并禁用防火墙</a></li>
<li><a href="#22%E9%80%9A%E8%BF%87docker%E5%AE%89%E8%A3%85elasticsearch">2.2.通过docker安装elasticsearch</a></li>
<li><a href="#23%E9%80%9A%E8%BF%87docker%E5%AE%89%E8%A3%85kibana">2.3.通过docker安装kibana</a></li>
</ul>
</li>
<li><a href="#3-es%E4%B8%AD%E7%9A%84-type-index-mapping-he-dsl">3. ES中的 type index, mapping he dsl</a></li>
<li><a href="#4-%E6%96%B0%E5%BB%BA%E6%95%B0%E6%8D%AE">4. 新建数据</a>
<ul>
<li><a href="#41%E9%80%9A%E8%BF%87putid%E6%96%B0%E5%BB%BA%E6%95%B0%E6%8D%AE">4.1.通过put+id新建数据</a></li>
<li><a href="#42-%E5%8F%91%E9%80%81post%E4%B8%8D%E5%B8%A6id%E6%96%B0%E5%BB%BA%E6%95%B0%E6%8D%AE">4.2. 发送post不带id新建数据</a></li>
<li><a href="#43-post-create">4.3 post create</a></li>
</ul>
</li>
<li><a href="#5-%E8%8E%B7%E5%8F%96%E6%95%B0%E6%8D%AE">5. 获取数据</a>
<ul>
<li><a href="#51-%E8%8E%B7%E5%8F%96%E6%95%B0%E6%8D%AE">5.1 获取数据</a></li>
<li><a href="#52-%E6%90%9C%E7%B4%A2%E6%95%B0%E6%8D%AE">5.2 搜索数据</a>
<ul>
<li><a href="#521-%E9%80%9A%E8%BF%87url%E6%9F%A5%E8%AF%A2%E6%95%B0%E6%8D%AE">5.2.1 通过urL查询数据</a></li>
<li><a href="#522%E9%80%9A%E8%BF%87request-body%E6%9F%A5%E8%AF%A2%E6%95%B0%E6%8D%AE-%E5%B9%B3%E6%97%B6%E7%BB%8F%E5%B8%B8%E7%94%A8%E5%88%B0%E4%B8%94%E9%87%8D%E8%A6%81">5.2.2通过request body查询数据 (平时经常用到，且重要)</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#6-%E6%9B%B4%E6%96%B0%E5%92%8C%E5%88%A0%E9%99%A4%E6%95%B0%E6%8D%AE">6. 更新和删除数据</a>
<ul>
<li><a href="#61-%E6%83%B3%E8%A6%81%E7%BB%99%E5%B7%B2%E6%9C%89%E7%9A%84%E6%95%B0%E6%8D%AE%E6%96%B0%E5%A2%9E%E5%AD%97%E6%AE%B5">6.1 想要给已有的数据新增字段</a></li>
<li><a href="#62-%E5%88%A0%E9%99%A4%E6%95%B0%E6%8D%AE%E5%92%8C%E7%B4%A2%E5%BC%95">6.2 删除数据和索引</a></li>
</ul>
</li>
<li><a href="#7-%E6%89%B9%E9%87%8F%E6%8F%92%E5%85%A5%E5%92%8C%E6%89%B9%E9%87%8F%E6%9F%A5%E8%AF%A2">7. 批量插入和批量查询</a>
<ul>
<li><a href="#71-%E6%89%B9%E9%87%8F%E6%8F%92%E5%85%A5bulk">7.1 批量插入（bulk）</a></li>
<li><a href="#72-%E6%89%B9%E9%87%8F%E8%8E%B7%E5%8F%96">7.2 批量获取</a></li>
</ul>
</li>
<li><a href="#8-query-dsl-%E6%9F%A5%E8%AF%A2">8. query dsl 查询</a>
<ul>
<li><a href="#81-%E4%B8%80%E4%B8%AA%E5%AE%8C%E6%95%B4%E7%9A%84%E6%9F%A5%E8%AF%A2%E8%AF%AD%E5%8F%A5%E5%BA%94%E8%AF%A5-%E5%A6%82%E4%BD%95%E5%86%99">8.1 一个完整的查询语句应该 如何写？</a></li>
<li><a href="#82-%E5%85%A8%E6%96%87%E6%9F%A5%E8%AF%A2%E7%9A%84%E6%96%B9%E6%B3%95-%E5%88%86%E8%AF%8D%E5%80%92%E6%8E%92%E7%B4%A2%E5%BC%95">8.2 全文查询的方法 - 分词，倒排索引</a>
<ul>
<li><a href="#821-match%E6%9F%A5%E8%AF%A2%E5%8C%B9%E9%85%8D%E6%9F%A5%E8%AF%A2">8.2.1 match查询（匹配查询）</a></li>
<li><a href="#822-match_phrase%E6%9F%A5%E8%AF%A2%E7%9F%AD%E8%AF%AD%E6%9F%A5%E8%AF%A2">8.2.2 match_phrase查询（短语查询）</a></li>
<li><a href="#823multi-match%E6%9F%A5%E8%AF%A2">8.2.3.multi match查询</a></li>
<li><a href="#824-query_string%E6%9F%A5%E8%AF%A2">8.2.4 query_string查询</a></li>
</ul>
</li>
<li><a href="#83-match_all%E6%9F%A5%E8%AF%A2">8.3 match_all查询</a></li>
<li><a href="#84-term%E7%BA%A7%E5%88%AB%E6%9F%A5%E8%AF%A2">8.4 term级别查询</a>
<ul>
<li><a href="#841-term%E6%9F%A5%E8%AF%A2-%E5%92%8Cmatch%E6%9F%A5%E8%AF%A2%E4%B8%8D%E5%90%8Cmatch%E4%BC%9A%E5%88%86%E8%AF%8D">8.4.1 term查询 （和match查询不同，match会分词）</a></li>
<li><a href="#842-range%E6%9F%A5%E8%AF%A2">8.4.2 range查询</a></li>
<li><a href="#843-exist%E6%9F%A5%E8%AF%A2">8.4.3 exist查询</a></li>
<li><a href="#844-%E6%A8%A1%E7%B3%8A%E6%9F%A5%E8%AF%A2">8.4.4 模糊查询</a></li>
</ul>
</li>
<li><a href="#85-%E5%A4%8D%E5%90%88%E6%9F%A5%E8%AF%A2">8.5 复合查询</a></li>
</ul>
</li>
<li><a href="#9-mapping">9. mapping</a>
<ul>
<li><a href="#91-%E4%BB%80%E4%B9%88%E6%98%AFmapping">9.1 什么是Mapping?</a></li>
</ul>
</li>
<li><a href="#10-elasticsearch-analyzer%E8%AF%A6%E8%A7%A3">10.  Elasticsearch Analyzer详解</a>
<ul>
<li><a href="#101-analyzer%E7%9A%84%E7%BB%84%E6%88%90">10.1 Analyzer的组成</a>
<ul>
<li><a href="#1011-character-filters">10.1.1 Character Filters</a></li>
<li><a href="#1012-tokenizer">10.1.2 Tokenizer</a></li>
<li><a href="#1013-token-filters">10.1.3 Token Filters</a></li>
</ul>
</li>
<li><a href="#102-elasticsearch%E5%86%85%E7%BD%AE%E7%9A%84%E5%88%86%E8%AF%8D%E5%99%A8">10.2 Elasticsearch内置的分词器</a>
<ul>
<li><a href="#1021-standard-analyzer">10.2.1 Standard Analyzer</a></li>
<li><a href="#1022-simple-analyzer">10.2.2 Simple Analyzer</a></li>
<li><a href="#1023-stop-analyzer">10.2.3 Stop Analyzer</a></li>
<li><a href="#1024-whitespace-analyzer">10.2.4 Whitespace Analyzer</a></li>
<li><a href="#1025-keyword-analyzer">10.2.5 Keyword Analyzer</a></li>
<li><a href="#1026-patter-analyzer">10.2.6 Patter Analyzer</a></li>
<li><a href="#1027-language-analyzer">10.2.7 Language Analyzer</a></li>
<li><a href="#1028-icu-analyzer">10.2.8 ICU Analyzer</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#11-%E5%88%86%E8%AF%8D%E7%9A%84%E9%87%8D%E8%A6%81%E6%80%A7">11. 分词的重要性</a>
<ul>
<li><a href="#111-%E6%96%87%E6%9C%AC%E5%88%86%E8%AF%8D">11.1 文本分词</a></li>
<li><a href="#112-%E5%88%86%E8%AF%8D%E7%9A%84%E6%84%8F%E4%B9%89-nlp">11.2 分词的意义 （NLP）</a>
<ul>
<li><a href="#1121-%E5%B0%86%E5%A4%8D%E6%9D%82%E9%97%AE%E9%A2%98%E8%BD%AC%E5%8C%96%E4%B8%BA%E6%95%B0%E5%AD%A6%E9%97%AE%E9%A2%98">11.2.1 将复杂问题转化为数学问题</a></li>
<li><a href="#1122-%E8%AF%8D%E6%98%AF%E4%B8%80%E4%B8%AA%E6%AF%94%E8%BE%83%E5%90%88%E9%80%82%E7%9A%84%E7%B2%92%E5%BA%A6">11.2.2 词是一个比较合适的粒度</a></li>
</ul>
</li>
<li><a href="#113-%E4%B8%AD%E8%8B%B1%E6%96%87%E5%88%86%E8%AF%8D%E7%9A%843%E4%B8%AA%E5%85%B8%E5%9E%8B%E5%8C%BA%E5%88%AB">11.3 中英文分词的3个典型区别</a></li>
<li><a href="#114-%E4%B8%AD%E6%96%87%E5%88%86%E8%AF%8D%E7%9A%843%E5%A4%A7%E9%9A%BE%E7%82%B9">11.4 中文分词的3大难点</a></li>
<li><a href="#115-3%E7%A7%8D%E5%85%B8%E5%9E%8B%E7%9A%84%E5%88%86%E8%AF%8D%E6%96%B9%E6%B3%95">11.5 3种典型的分词方法</a></li>
<li><a href="#116-%E4%B8%AD%E6%96%87%E5%88%86%E8%AF%8D%E5%B7%A5%E5%85%B7">11.6 中文分词工具</a></li>
<li><a href="#117-%E8%8B%B1%E6%96%87%E5%88%86%E8%AF%8D%E5%B7%A5%E5%85%B7">11.7 英文分词工具</a></li>
<li><a href="#118-%E6%80%BB%E7%BB%93">11.8 总结</a></li>
</ul>
</li>
<li><a href="#12-ik%E5%88%86%E8%AF%8D%E5%99%A8%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE">12. IK分词器安装和配置</a></li>
</ul>

                    </div>
                    <div class="tog">
                        <div class="toggleContainer">
                            <div class="toggle">
                                <i class="fas fa-angle-double-up"></i>
                            </div>
                        </div>
                    </div>
                    <!---------------------------- 评论系统👇 ------------------------->
                    <div id="comment" class="comment">
                        <div class="commentcontainer">
                            
                                
                                    
        <div id="vcomments">
        </div>
        <script>
            var valine = new Valine();
            var curpath = window.location.pathname;
            if (curpath[curpath.length - 1] != '/')
                curpath += '/'
            valine.init({
                el: '#vcomments',
                appId: '6kX8OLncEr2WFzTCkIaiZzkj-gzGzoHsz',
                appKey: 'nSVcrCBD1jAuhDiW4uhz2szQ',
                avatar: 'retro',
                pageSize: 10,
                placeholder: '既然来了，何不畅所欲言呢？',
                recordIP: true,
                path: curpath //[重点] 记得添加path路径
            });
        </script>
        <script type="text/javascript">
            var jrsc = '既然来了，何不畅所欲言呢？';
            jinrishici.load(function (result) {
                // 自己的处理逻辑
                jrsc = result.data.content + "\n「" + result.data.origin.title + "」" + result.data.origin
                    .dynasty + " · " + result.data.origin.author;
            });
        </script>


                                    <div class="clear"></div>
                                
                            
                        </div>
                    </div>
                    <!---------------------------- 评论系统👆 ------------------------->
                </div>
                <!-- main标签，pjax渲染时加载以上内容👆 -->
                <div class="col-md-1 col-lg-2"></div>
                <div id="bg">
                </div>
            </div>
            <!-- ----------------左侧菜单栏html 👆-------------------------------------->
            
        </div>
        <!-- aplayer播放器加载👇 -->
            
            <head>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.css">
</head>

<body>
    <div class="miniMode">
        <meting-js id="myaplayer" server="netease" type="playlist" fixed="true" order="default" muted="muted">
        </meting-js>
    </div>
</body>


<script src="https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js"></script>
<script>
    function aplayerInit() {
        var aplayerid = "2025151208";
        var aplayerserver = "netease";
        var aplayerorder = "random";
        var aplayerautoplay = "false";
        var aplayer = $("#myaplayer");
        aplayer.attr("server", aplayerserver);
        aplayer.attr("id", aplayerid);
        aplayer.attr("order", aplayerorder);
        if (aplayerautoplay == "true")
            aplayer.attr("autoplay", "true");
    }
    aplayerInit();
</script>

<script src="https://cdn.jsdelivr.net/gh/850552586/ericamcdn@0.1/js/Aplayer.min.js"></script>
<!-- require MetingJS -->
<script src="https://cdn.jsdelivr.net/npm/meting@2/dist/Meting.min.js"></script>

<script>
    function aplayerbtnInit() {
        var player = document.querySelectorAll('meting-js')[0].aplayer;
        if(player==undefined)return false;
        player.lrc.hide();
        var mbabtn = $("#mbaplayer");
        if (player.paused == false) {
            mbabtn.removeClass("fa-play-circle-o");
            mbabtn.addClass("fa-pause-circle");
        } else {
            mbabtn.addClass("fa-play-circle-o");
            mbabtn.removeClass("fa-pause-circle");
        }
    }

    function aplayerPlay() {
        var player = document.querySelectorAll('meting-js')[0].aplayer;
        var mbabtn = $("#mbaplayer");
        if (player.paused == true) {
            player.play();
            mbabtn.removeClass("fa-play-circle-o");
            mbabtn.addClass("fa-pause-circle");
        } else {
            player.pause();
            mbabtn.addClass("fa-play-circle-o");
            mbabtn.removeClass("fa-pause-circle");
        }
    }
</script>
            
        <!-- aplayer播放器加载👆 -->
    </div>
    <!-- 背景图加载方式👇 -->
    <div id="bgchoice" style="display: none">default
                </div>
                
                <div id="bgurl" style="display:none">/media/images/custom-bgimage.jpg</div>
                
    <!-- 背景图加载方式👆 -->
</body>

<script>
    //初始化
    //更换twikoo头像
    setTimeout(replaceAvatar,1000);
    setTimeout(replaceAvatar,2000);
    setTimeout(replaceAvatar,8000);
    // --------为每张图片添加懒加载（lazyload）标签-->懒加载功能 👇------------
    lazyload();
    //为文章内所有代码块添加代码复制功能 👇
    codeinit();
    // ------代码高亮显示功能-------------
    hljs.initHighlightingOnLoad();
    if (shareChoice)
        shareInit();
    if (donateChoice)
        donateInit();
</script>

<!------------------ 加载live2d模型功能（看板娘）👇 ---------------->

<script type="text/javascript">
    var message_Path = '/live2d/'
    var home_Path = document.getElementById("domainname").innerHTML + "/"; //此处修改为你的域名，必须带斜杠
</script>
<script type="text/javascript" src="https://hzqyihui.github.io/media/js/live2d.js"></script>
<script type="text/javascript" src="https://hzqyihui.github.io/media/live2d/js/message.js"></script>
<script type="text/javascript">
    loadlive2d("live2d", "https://hzqyihui.github.io/media/live2d/assets/tororo.model.json");
</script>

<!------------------ 加载live2d模型功能（看板娘）👆 ---------------->


<!----------------------- 返回顶部按钮功能👇 --------------------->
<script>
    $(function () {
        $('.toggleContainer').click(function () {
            $('html,body').animate({
                scrollTop: '0px'
            }, 800);
        });
        $(window).scroll(function () {
            var st = $(window).scrollTop();
            if (st > 30) {
                $(".toggleContainer").fadeIn(400);
            } else {
                $(".toggleContainer").fadeOut(100);
            }
        });
    });
</script>
<!----------------------- 返回顶部按钮功能👆 --------------------->


<!------------ 加载全局背景图功能👇（开始时没有写好，这功能有点鸡肋/(ㄒoㄒ)/~~） -->
<script>
    var bgchoice = "default"
    var bg = $('#bg');
    var bgurl = document.getElementById("bgurl").innerHTML;
    if (bgchoice == 'default')
    {
        for (var i = 0; i < 3; i++)
            bgurl = bgurl.replace("\\", "/");
        bgurl = "https://hzqyihui.github.io/" + bgurl;
    }
    bg.css("background", "url('" + bgurl + "')");

    window.onload = function () {
        aplayerbtnInit();
    }
</script>
<!------------ 加载全局背景图功能👆（开始时没有写好，这功能有点鸡肋/(ㄒoㄒ)/~~） -->




<script src="https://hzqyihui.github.io/media/js/index.js"></script>


<script>
    //加载后的事件同步（阅读量、移动端评论等
    window.onload = function () {
    //代码块高亮渲染
    document.querySelectorAll('pre code').forEach((block) => {
            hljs.highlightBlock(block);
    });
        getHotnum();
        var sharepc = $(".share").eq(0).html();
        $(".share").eq(1).html(sharepc);   //插件只会寻找一个分享标签渲染，所以需要手动添加到移动端
        aplayerbtnInit();
        $(".hljs").css({
            "padding": "20px"
        })
    }
</script>

<!-- <script src="https://hzqyihui.github.io/media/js/av-min.js"></script> -->
<!-- <script src="https://cdn.jsdelivr.net/npm/leancloud-storage@3.13.0/dist/av-min.js"></script> -->
<!-- <script src="https://cdn.jsdelivr.net/npm/leancloud-storage@4.6.1/dist/av-live-query-min.js"></script> -->